0

Fitbit API への接続に Titanium (Appcelerator) を使用しています。( http://www.appcelerator.com )

トークンを要求しようとすると、「無効な署名」が表示されるという問題に直面しています。

Titanium.Network.HTTPClient クラスの HTTPClient を使用して HTTP リクエストを送信しています。また、 https: //github.com/ddo/oauth-1.0a の oauth-1.0a.js ライブラリを使用して、ノンスと署名値の取得を支援します。

コードは次のとおりです。

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 に答える