使用node-oauth和护照进行Twitter API的授权调用

我有OAuth设置与passport-twitter,login和身份validation工作正常。 尝试执行授权请求(如更新状态)时会出现问题。

passport.use(new TwitterStrategy({ consumerKey: config.twitter.clientID , consumerSecret: config.twitter.clientSecret , callbackURL: config.twitter.callback_url || 'http://' + config.domain + '/auth/twitter/callback' }, function(token, tokenSecret, profile, done) { Player.findOne({ 'twitter.id': profile.id }, function (err, player) { if (err) { return done(err) } if (!player) { var player = new Player({ name: profile.displayName , twitter: profile._json , twitter_token: token , twitter_tokenSecret: tokenSecret }) player.save(function (err, player) { if (err) log.error(err); return done(err, player); }) } else { return done(err, player) } }) } )) 

所以这通过mongoose和工作节省了玩家。 我保存由护照给出的令牌和tokenSecret,并假定它们是使用oAuth().getOAuthRequestToken()生成的,作为来自Twitter的原始callback的一部分,因此对于给定的login会话的其余部分应该是有效的。 (也许是一个不好的假设?)

之后,当我们想要为用户推特时,获取了玩家logging及其关联的令牌+秘密:

  function twitter_oauth() { return new OAuth ( "https://api.twitter.com/oauth/request_token", "https://api.twitter.com/oauth/access_token", keys.consumerKey, keys.consumerSecret, "1.0", null, "HMAC-SHA1" ) } .... twitter_oauth().post(api_endpoint, token, secret, body, "application/json", function (error, data, res) { if (error) { console.error(error) } else { console.log('tweet sent') } } ) 

对此的响应只是状态401和“无法使用OAuth进行身份validation”。

那么,我错过了一些重要的东西吗? 我还没有深入查看护照的来源,找出实际上是什么tokentoken tokenSecret参数,但在这里问,希望有人指出上述的主要缺陷。

尝试查看dev.twitter.com上的应用程序设置是否设置为读取和写入。

同时检查标题中的时间戳,如果5分钟到twitter的服务器时钟,请求将失败。

你也可以尝试另一个库,我已经使用node-oauth,或者你可以尝试基于node-oauth的ntwitter 。

谢谢@Brmm的好build议,但在这种情况下,事实certificate我们在密钥中使用了不同的Twitter帐户进行身份validation和api调用,因为#bonehead

你可以写这个

 var tw = TwitterStrategy({ consumerKey: config.twitter.clientID , consumerSecret: config.twitter.clientSecret , callbackURL: config.twitter.callback_url || 'http://' + config.domain + '/auth/twitter/callback' }, function(token, tokenSecret, profile, done) { Player.findOne({ 'twitter.id': profile.id }, function (err, player) { if (err) { return done(err) } if (!player) { var player = new Player({ name: profile.displayName , twitter: profile._json , twitter_token: token , twitter_tokenSecret: tokenSecret }) player.save(function (err, player) { if (err) log.error(err); return done(err, player); }) } else { return done(err, player) } }) }); passport.use(tw); 

你不需要新的Oauth实例。 你可以像这样使用它。

 tw._oauth.post(api_endpoint, token, secret, body, "application/json", function (error, data, res) { if (error) { console.error(error) } else { console.log('tweet sent') } } ); 

再见!