使用node-oauth和passport对Twitter API进行授权调用

时间:2012-11-30 05:25:49

标签: node.js twitter oauth passport.js

我使用passport-twitter设置OAuth,登录和身份验证工作正常。尝试执行更新状态等授权请求时会出现问题。

   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原始回调的一部分,因此应该对给定登录会话的其余部分有效。 (也许是一个糟糕的假设?)

稍后,当我们想要为用户发送推文时,已经获取了播放器记录及其相关的令牌+秘密:

 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进行身份验证。”

那么,我错过了一些重要的东西吗?我还没有深入了解护照来源,找出实际上有tokentokenSecret个参数,但是在这里要求有人指出上面的主要缺陷。

3 个答案:

答案 0 :(得分:1)

尝试查看dev.twitter.com上的应用程序设置是否设置为read&写。

同时检查标题中的时间戳,如果它与Twitter的服务器时钟关闭5分钟,则请求将失败。

您还可以尝试使用其他库,我已经使用了node-oauth,或者您可以尝试使用基于node-oauth的ntwitter

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你可以写这个。

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') 
                            }                     
                        }                         
);

侨!