1

私はしばらくこれにこだわっています。OAuthSimple.js を使用して、私が作成した Chrome 拡張機能で Twitter とやり取りしようとしています。

署名プロセスは、ユーザーのステータスを取得するリクエストに対しては正常に機能しているように見えますが、リツイート、返信、またはツイートをお気に入りとしてマークしようとすると、正常に認証されるリクエストを構築できないようです。

ここのガイドに従っています。また、リクエストを構造化するさまざまな方法を試し、リクエストの内容を Twitter が提供する OAuth ツールの出力 (チェックアウトしているようです) と比較しましたが、まだ 401 エラーと一般的な「認証できませんでした」あなた」の反応。

リクエストを作成しようとしている方法は次のとおりです。

var sendTwitterRequest = function(url, params, method, callback) {

  var request = null;

        if ( localStorage.twitterAuthToken ) {
            OAuthSimple().reset();
            request = OAuthSimple(TwitterConsumerKey,TwitterConsumerSecret).sign({
                action:method,
                method:"HMAC-SHA1",
                dataType:"JSON",
                path:url,
                parameters:params,
                signatures:{
                    oauth_version:'1.0',
                    oauth_token:localStorage.twitterAuthToken,
                    oauth_secret:localStorage.twitterAuthVerifier
                }
            });

            console.log(request);

            $j.ajax({
                url:request.signed_url,
                type:method,
                data:request.parameters,
                success:callback
            });     

        }
    };

次に、このメソッドを次のように呼び出します。

  // this works, I get the data and can do stuff with it
  sendTwitterRequest('http://api.twitter.com/1/statuses/user_timeline.json?user_id=',null,'GET',someMethod());

  // this fails and throws a 401 error every time 
  sendTwitterRequest("https://api.twitter.com/1/statuses/retweet/"+tweetKey+".json",null,'POST',someOtherMethod());

何か不足していますか?前もって感謝します!

4

1 に答える 1

1

私が作成しているリクエストは問題ないことがわかりました.OAuthトークンのリクエストトークンを交換するために最後のリクエストが必要でした. ユーザーに入力を求めるプロンプトが表示されたとき、この手順はカバーされていると思っていましたが、間違っていたことが判明しました。

また、トークン リクエストとタイムライン リクエストの両方を処理するには OAuth.js しか取得できなかったため、OAuthSimple.js から OAuth.js のみに切り替えることになりました。

これの一部は、私のアプリケーションが行っていることにかなり固有のものであるため、おそらく変更する必要があります。

新しい sendTwitterRequest メソッド:

var sendTwitterRequest = function(options){

        var accessor={
            consumerSecret:TwitterConsumerSecret
        };

        var message={
            action:options.url,
            method:options.method||"GET",
            parameters:[
                ["oauth_consumer_key",TwitterConsumerKey],
                ["oauth_signature_method","HMAC-SHA1"],
                ["oauth_version","1.0"]
            ]
        };  

        if(options.token){
            message.parameters.push(["oauth_token",options.token])
        }

        if(options.tokenSecret){
            accessor.tokenSecret=options.tokenSecret
        }

        for(var a in options.parameters) {
            message.parameters.push(options.parameters[a])
        }

        OAuth.setTimestampAndNonce(message);
        OAuth.SignatureMethod.sign(message,accessor);

        try {
            $j.ajax({
                url:message.action,
                async:options.async||true,
                type:message.method||'GET',
                data:OAuth.getParameterMap(message.parameters),
                dataType:options.format||'JSON',
                success:function(data) {
                    if (options.success) {options.success(data);}
                }
            });
        } catch ( e ) {
        }

    };

そしてそれに依存するメソッド:

// asks Twitter for an oauth request token. User authorizes and the request token is provided
requestTwitterToken = function() {  
    // this is semi-specific to what my extension is doing, your callback string may need
    // to be slightly different.
    var callbackString = window.top.location + "?t=" + Date.now();

    var params = [
        [ 'oauth_callback', callbackString ]
    ];

    sendTwitterRequest({
        url: "https://api.twitter.com/oauth/request_token",
        method: 'POST',
        parameters: params, 
        format: 'TEXT',
        success: function(data) {
            var returnedParams = getCallbackParams(data);
            if ( returnedParams.oauth_token ) {
                chrome.tabs.create({
                    url:"https://api.twitter.com/oauth/authorize?oauth_token=" + returnedParams.oauth_token
                });
            }
        },error:function( e ) {
            console.log( 'error' );
            console.log( e );
        }
    }); 
};

// exchanges the Twitter request token for an actual access token.
signIntoTwitter = function(token, secret, callback) {
    var auth_url = "https://api.twitter.com/oauth/access_token";

    var authCallback = function(data) {
        var tokens = getCallbackParams(data);

        localStorage.twitterAuthToken = tokens.oauth_token || null;
        localStorage.twitterAuthTokenSecret = tokens.oauth_token_secret || null;

        callback();
    };
    try {
        sendTwitterRequest({url:auth_url, method:'POST', async:true, format:'TEXT', token:token, tokenSecret:secret, success:authCallback});
    } catch ( e ) {
        console.log(e);
    }

};

これにより、手順は次のようになります。

  • Twitter にトークン ( requestTwitterToken()) を要求し、コールバックを提供する
  • コールバックで、トークンが提供されているかどうかを確認します。もしそうなら、それは初期トークンです
  • トークンを Twitter に戻し、ユーザーがアクセスを許可できるようにする Twitter 認証ページを開きます。
  • この呼び出しへのコールバックで、アクセス トークンが提供されたかどうかを確認します
  • リクエスト トークンをアクセス トークンと交換する ( signIntoTwitter())

あとは、sendTwitterRequest()メソッドを使って Twitter の API にヒットし、タイムラインを取得してツイートを投稿するだけです。

于 2013-02-09T05:55:45.983 に答える