Fitbit API OAuth 1.0a от Titanium (Appcelerator)

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

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

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

Вот код:

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 = "R@nD0m_$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);
    };
}

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

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

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

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

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


person Alvin Tandian    schedule 12.05.2015    source источник


Ответы (1)


У меня получается решить.

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

Таким образом, 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&...
person Alvin Tandian    schedule 13.05.2015