3

私は現在、https ://dev.twitter.com/docs/auth/implementing-sign-twitterで説明されているアプローチに従って、Twitterの認証機能の組み込みに取り組んでいます。Ajaxを使用してPOST「http」リクエストを送信していますが、常に「401:Unauthorized」エラーが発生しています。私のコードは以下の通りです:

function getTweets() {
    var time = generateTimestamp(); 
    var nonce = generateNonce();
    var signature = generateSignature(time, nonce);
    var headers = {
          "Authorization": 'OAuth oauth_callback="http%3A%2F%2Fwww.google.com%2F", oauth_consumer_key="eEeAAz9fakedtAOlIUhPgQ", oauth_nonce="bbc34b2ca6faabogus6dfc025907fa334", oauth_signature="' + signature + '", oauth_signature_method="HMAC-SHA1", oauth_timestamp="' + time + '", oauth_version="1.0"'
    };

    $.ajax({
        type: "POST",
        url: "https://api.twitter.com/oauth/request_token",
        dataType: "text",
        headers: headers,
        success: function(data) {
            alert("Success!");
            console.log(data);
        },
        error: function(jq) {
            alert("Request Failed.");
            console.log(jq.statusText);
        }
    });
}

function generateTimestamp() {
    var currentTime = new Date;
    currentTime = Math.floor(currentTime.getTime() / 1000);
    return currentTime;
}

function generateNonce() {
    var code = "";
    for (var i = 0; i < 20; i++) {
        code += Math.floor(Math.random() * 9).toString();
    }
    return code;
}  

function generateSignature(timestamp, nonce) {
    var http_method = "POST";
    var base_url = "https://api.twitter.com/oauth/request_token";
    var consumer_key = "eEeAAz9hUKtdjunkeIUhPgQ";
    var consumer_secret = "c7wHxnjubxVDcc5hYFqnotactuallymysecretWs2XazUFde0lPRBtBQ";
    var signature_method = "HMAC-SHA1";
    var token = "609493744-kNPzLKSI4Hg9NWQnopeFPb91eXFUutFm1nZ2hDk2";
    var token_secret = "15WOJS9Ji1AXsKRkyAZrxKdsalted5Gj5ZyEAb9aVrJxI";
    var version = "1.0";
    var parameter_string = "oauth_callback=" + encodeURIComponent(base_url) + "&oauth_consumer_key=" + consumer_key + "&oauth_nonce=" + nonce + "&oauth_consumer_key=" + consumer_key + "&oauth_signature_method=" + signature_method + "&oauth_timestamp=" + timestamp +"&oauth_version=" + version; 
    var base_string = http_method + "&" + encodeURIComponent(base_url) + "&" + encodeURIComponent(parameter_string);
    var signing_key = encodeURIComponent(consumer_secret) + "&";  
    var signature = encodeURIComponent(window.btoa(CryptoJS.HmacSHA1(base_string, signing_key)));
    alert(signature);
    return signature;
}

このエラーをより明確にする他の情報があれば、以下に投稿してください。ありがとう。

4

1 に答える 1

1

Twitter の OAuth ダンスと API をいじるために node.js ライブラリを作成しました。コードはこちら、tweeter.js

ヘッダーと署名を作成するためのロジックを順を追って説明してください ( 348行目から) 。

あなたが投稿したコードに見当たらないことの1つは、元のヘッダーを含めるために署名文字列を生成する必要があり、その後、生成された文字列でヘッダーを再構築する必要があることです。それは大きな痛みであり、それを理解するのにしばらく時間がかかりました.

私が書いたコードは node.js 向けですが、ニーズを満たすために多くのロジックを再利用できるはずです。

編集
私はhueniverseと呼ばれるサイトがOAuthを非常によく文書化しているのを見つけました。実際、ロジックを検証するための独自のヘッダーを作成するためのユーティリティがここにあります ([独自に作成] ラジオ ボタンを選択します)。

編集2

oauth_signatureヘッダーに値を含めることをより適切に説明するために、この時点までのすべてのデータがあるとします。

var headerObj = {
    oauth_consumer_key="123456789",
    oauth_token="11111",
    oauth_nonce="asdfghjkl%3B",
    oauth_timestamp="1341852000",
    oauth_signature_method="HMAC-SHA1",
    oauth_version="1.0"
};

HMAC-SHA1 署名を作成し、以下を受け取ります。"jBpoONisOt5kFYOrQ5fHCSZBGkI%3D"

次に、その戻り値を に追加すると、次のようになりheaderObjます。

headerObj = {
    oauth_consumer_key="123456789",
    oauth_token="11111",
    oauth_nonce="asdfghjkl%3B",
    oauth_timestamp="1341852000",
    oauth_signature_method="HMAC-SHA1",
    oauth_version="1.0",
    oauth_signature="jBpoONisOt5kFYOrQ5fHCSZBGkI%3D"
};

そして、この変更されたバージョンの headerObj は、HTTP ヘッダーを構築する元になります。

GET / HTTP/1.1
Host: api.twitter.com:443
Authorization: OAuth realm="https://api.twitter.com/",
    oauth_consumer_key="123456789",
    oauth_token="11111",
    oauth_nonce="asdfghjkl%3B",
    oauth_timestamp="1341852000",
    oauth_signature_method="HMAC-SHA1",
    oauth_version="1.0",
    oauth_signature="jBpoONisOt5kFYOrQ5fHCSZBGkI%3D"

注: ホスト/レルム/ポートを確認していないため、これらはおそらく間違っています。それらについては API を確認してください。

これが行われる理由は、Twitter 側 (これは OAuth 実装の詳細です) で、oauth_signature値が削除され、残りのヘッダーがハッシュされ、その戻り値が で送信された値と比較されるためですoauth_signature。これは、封筒の封蝋のようなものです... ヘッダーの残りの部分のハッシュが、送信したハッシュ値と一致しない場合oauth_signature、Twitter は送信者または内容を信頼しないことを認識します。

編集 2.5

これをコメントから回答に移動しています。

tweeter.js のこの行を調べると、ロジックがわかります。

   var signature = self.oauthSignature(method, path, headerObj, query);
    headerObj.oauth_signature = qs.escape(signature);

    // concat the header object into a csv string
    var header = 'OAuth realm="Twitter API",';
    var oauthParts = [];
    for (var h in headerObj) {
        oauthParts.push(h + '="'+headerObj[h]+'"');
    }
    header+= oauthParts.join(',');

    //...

    return header;

このコードは、編集 2 で説明したように、JSON オブジェクトを にkey="value"格納された文字列に変換oauthParts[]し、その配列の各要素を 1 つのカンマ区切りの文字列に結合します。OAuth realm="Twitter API",

于 2012-06-30T01:23:09.360 に答える