javascript - 通过 OAuthSimple.js 发布到 Twitter

标签 javascript oauth google-chrome-extension twitter twitter-oauth

我已经被这个问题困扰了一段时间了。我正在尝试在我编写的 Chrome 扩展程序中使用 OAuthSimple.js 与 Twitter 交互。

对于检索用户状态的请求,签名过程似乎工作得很好,但当我尝试转发、回复或将推文标记为收藏时,我似乎无法构造一个能够成功进行身份验证的请求。

我正在遵循指南 here 。我还尝试了多种构造请求的方法,并将请求内容与 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());

我错过了什么吗?提前致谢!

最佳答案

事实证明,我创建的请求很好,我只需要最后一个请求来将请求 token 交换为 OAuth token 。我以为当提示用户输入时就涵盖了这一步,但事实证明我错了。

我最终也从 OAuthSimple.js 切换到 OAuth.js,因为我只能让 OAuth.js 来处理 token 请求和时间线请求。

其中一些内容非常特定于我的应用程序正在执行的操作,因此您可能需要对其进行修改。

新的 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 请求 token (requestTwitterToken()) 并提供回调
  • 在回调中,检查是否提供了 token 。如果是,则它是一个初始 token
  • 将 token 传回 Twitter 并打开 Twitter 身份验证页面,该页面允许用户授予访问权限
  • 在此调用的回调中,查看是否提供了访问 token
  • 将请求 token 交换为访问 token ( signIntoTwitter() )

之后,我只需使用 sendTwitterRequest() 方法来访问 Twitter 的 API 来获取时间线并发布推文。

关于javascript - 通过 OAuthSimple.js 发布到 Twitter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14768062/

相关文章:

javascript - Firefox 和 Chrome 的 CORS 错误

javascript - 为什么 animate 的回调函数(完整)在开始时执行?

javascript - jQuery(选择器).contains 抛出 "no method"TypeError?

java - Spring 安全、OAUTH Cors、选项

google-chrome-extension - 调整 chrome 主题图像的大小以适合屏幕尺寸

javascript - 无法在 HTML 页面上查看 JavaScript 函数的结果

oauth - Paypal Oauth 返回服务器错误获取示例 PizzaApp 中的 token

django - 回调中使用了错误的 sessionID,但仅限于一台特定计算机

javascript - 如何识别由于 Chrome 扩展而导致的 DOM html 代码更改

javascript - background.html 与 background.js - chrome 扩展