2015-05-12 3 views
0

Я использую Titanium (Appcelerator) для подключения к Fitbit API. (http://www.appcelerator.com)Fitbit API OAuth 1.0a от Titanium (Appcelerator)

У меня возникли проблемы с получением «Недействительной подписи», когда я пытаюсь запросить токен.

Я использую HTTPClient из класса Titanium.Network.HTTPClient для отправки HTTP-запроса. Я также использую библиотеку oauth-1.0a.js от https://github.com/ddo/oauth-1.0a, чтобы помочь получить значение nonce и signature.

Вот код:

Ti.include('/oauth/ddo/hmac-sha1.js'); 
Ti.include('/oauth/ddo/enc-base64-min.js'); 
Ti.include('/oauth/ddo/oauth-1.0a.js'); 

function FitBitAuth() { 
    FitBitAuth.signatureMethod = "HMAC-SHA1"; 
    FitBitAuth.clientKey = 'XXXXXXXXXXXXXXXXXXXXXXXXX'; 
    FitBitAuth.clientSecret = 'XXXXXXXXXXXXXXXXXXXXXXXXXX'; 
    FitBitAuth.nonce = "[email protected]_$tR!nGss"; 
    FitBitAuth.request_token_url = "https://api.fitbit.com/oauth/request_token"; 
    FitBitAuth.callback_url = "http://www.fitbit.com"; 
} 

FitBitAuth.prototype.createConsumerTokenSecretPair = function() { 
    return OAuth({ 
     consumer : { 
      public : FitBitAuth.clientKey, 
      secret : FitBitAuth.clientSecret 
     }, 
     signature_method : FitBitAuth.signatureMethod 
    }); 
}; 

FitBitAuth.prototype.getRequestTokenRequestData = function() { 
     return { 
     url : "https://api.fitbit.com/oauth/request_token", 
     method : 'POST' 
    }; 
}; 

FitBitAuth.prototype.requestToken = function() { 
    var oauth = this.createConsumerTokenSecretPair(); 
    var request_data = this.getRequestTokenRequestData(); 
    var authorized_request = oauth.authorize(request_data, '', FitBitAuth.nonce, FitBitAuth.timestamp); 
    //alert(authorized_request); 
    return authorized_request; 
}; 

function auth1a() { 
    var fb = new FitBitAuth(); 
    var rt = fb.requestToken(); 
    var req = Ti.Network.createHTTPClient(); 
    req.open("POST", FitBitAuth.request_token_url); 
    req.setRequestHeader('Authorization', 'OAuth oauth_consumer_key="'+FitBitAuth.clientKey+'"'); 
    Ti.API.info(rt); 
    req.send({ 
     oauth_timestamp : rt.oauth_timestamp, 
     oauth_nonce : rt.oauth_nonce, 
     oauth_signature : encodeURIComponent(rt.oauth_signature), 
     oauth_signature_method: rt.oauth_signature_method, 
     oauth_callback : encodeURIComponent(FitBitAuth.callback_url), 
     oauth_version : rt.oauth_version 
    }); 

    req.onload = function() { 
     var json = this.responseText; 
     Ti.API.info("HEADER ====================="); 
     Ti.API.info(req.getAllResponseHeaders()); 
     Ti.API.info("END HEADER ================="); 
     Ti.API.info(json); 
     var response = JSON.parse(json); 
     //alert(response); 
    }; 
} 

Я также попытался инструментом Fitbit API отладки, чтобы помочь мне в получении всех прав подписи, на самом деле подпись и база Строки действительно совпадает с показанным на Fitbit API отладки.

Однако, я получаю эту недействительную подпись, обратный пример JSON показан ниже:

{"errors":[{"errorType":"oauth","fieldName":"oauth_signature","message":"Invalid signature: rN**ahem**SGJmFwHp6C38%2F3rMKEe6ZM%3D"}],"success":false} 

Я также уже протестировал сделать curl путь, и он работает от терминала, но безрезультатно это делает не дайте мне успеха от Титана.

Любая помощь приветствуется.

ответ

0

Мне это удалось.

Я попытался использовать другой способ вставки параметров через заголовок.

Такое, что setRequestHeader будет выглядеть следующим образом:

req.setRequestHeader('Authorization', 'OAuth oauth_consumer_key="'+FitBitAuth.clientKey+'", oauth_nonce="'+rt.oauth_nonce+'", oauth_signature="'+rt.oauth_signature+'",...'); 

В качестве альтернативы, мы можем также использовать встроенный в toHeader функции библиотеки OAuth, что я использую:

oauth.toHeader(oauth_data); 

Кодекса выше будет производить данные oauth в парах ключ-значение.

{ 
    'Authorization' : 'OAuth oauth_consumer_key="xxxxxxxxxxxxx"&oauth_nonce="xxxxxx"&... 
} 

Таким образом, вместо длинного кода для setRequestHeader, мы можем использовать значения toHeader, приведенные ниже код:

req.setRequestHeader('Authorization', oauth.toHeader(oauth_data).Authorization); 

Обратите внимание, что результат возвращения Fitbit в незашифрованном виде.

auth_token=xxxxxxxx&auth_token_secret=xxxxxxxxx&...