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 令牌。当提示用户输入时,我认为这一步已经涵盖,但事实证明我错了。

我也最终从 OAuthSimple.js 切换到 OAuth.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 回答