7

FatSecret REST APIを使用しています

OAuthSimple JavaScript ライブラリを使用して、署名付き URL を生成しています。これが私が持っているコードです-

    params['oauth_timestamp'] = Math.floor(new Date().getTime()/1000);
    params['oauth_nonce'] = '1234';
    params['oauth_version'] = '1.0';

    var paramStr = '';
    for(var key in params){
        paramStr += key+"="+params[key]+"&";
    }    
    paramStr = paramStr.substring(0,paramStr.length-1);

    var oauth = OAuthSimple();
    oauth.setAction('GET');
    var o = oauth.sign(
            {
             path:this.requestURL,
             parameters: paramStr,
             signatures:{
                api_key:this.apiKey,
                shared_secret:this.sharedSecret,
                access_token: this.accessToken,
                access_secret: this.accessSecret
             }
            });
    console.log(o.signed_url);
    return o.signed_url;

params は、この呼び出しの oauth に関連しないすべてのパラメーターを含む連想配列です。この署名付き URL を使用すると、「無効/使用されたナンス」が表示されます

OAuth テスト ツールは同じ OAuthSimple ライブラリを使用し、同じパラメーター (タイムスタンプを含む) をすべて入力すると、まったく同じ URL が生成されます。

唯一の違いは、テスト ツールによって生成された URL が機能し、サーバーからの完全な応答が得られることです。私のコードによって生成された URL はそうではありません。

タイムスタンプの MD5 を送信するなど、さまざまなナンス値を試しましたが、同じエラーが発生します。私が現在 1234 を使用している理由は、テスト ツールがデフォルトで 1234 を使用しており、それが機能しているように見えるからです。

どんな助けでも大歓迎です。前もって感謝します。

4

3 に答える 3

6

@Saravanan の回答を、現在のブラウザーで動作するもので更新します。

function genNonce() {
    const charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._~'
    const result = [];
    window.crypto.getRandomValues(new Uint8Array(32)).forEach(c =>
        result.push(charset[c % charset.length]));
    return result.join('');
}

console.info(genNonce());
于 2017-02-23T04:00:01.277 に答える
3

Twitter のドキュメントによるナンス値:

このリクエストの値は、base64 で 32 バイトのランダム データをエンコードし、単語以外のすべての文字を取り除くことによって生成されましたが、比較的ランダムな英数字文字列を生成する方法であれば、ここでは問題ありません。

上記のメモに基づいて、次の JavaScript コードを使用して、リクエストを送信するたびに nonce 値を生成します。

var nonceLen = 32;
return crypto.randomBytes(Math.ceil(nonceLen * 3 / 4))
    .toString('base64')   // convert to base64 format
    .slice(0, nonceLen)        // return required number of characters
    .replace(/\+/g, '0')  // replace '+' with '0'
    .replace(/\//g, '0'); // replace '/' with '0'

うまくいくならこれを試してみてください!

于 2014-07-16T09:37:08.313 に答える