0

我正在使用 Titanium (Appcelerator) 连接到 Fitbit API。( http://www.appcelerator.com )

当我尝试请求令牌时,我一直面临获得“无效签名”的问题。

我正在使用 Titanium.Network.HTTPClient 类中的 HTTPClient 来发送 HTTP 请求。我还使用来自https://github.com/ddo/oauth-1.0a的 oauth-1.0a.js 库来帮助获取 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);
    };
}

我还尝试了 Fitbit API 调试工具来帮助我正确获取所有签名,实际上签名和基本字符串与 Fitbit API 调试工具显示的匹配。

但是,我不断收到此无效签名,示例 JSON 返回如下所示:

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

我也已经测试过这样做的curl方式,它可以在终端上运行,但无济于事,它并没有让我在 Titanium 上取得成功。

任何帮助表示赞赏。

4

1 回答 1

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&...
于 2015-05-13T12:01:57.333 回答