1

我用护照推特设置了 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)                                                                                                                     
         }                                                                                                                                 
       })                                                                                                                                  
     }                                                                                                                                     
   ))

所以这通过猫鼬保存了播放器并且可以工作。我保存了护照给定的令牌和令牌秘密,并假设它们是oAuth().getOAuthRequestToken()作为来自 Twitter 的原始回调的一部分生成的,因此对于给定登录会话的其余部分应该是有效的。(也许是一个糟糕的假设?)

稍后,当我们想为用户发布推文时,已经获取了 Player 记录及其关联的令牌+秘密:

 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论据,但在这里问希望有人能指出上述的主要缺陷。

4

3 回答 3

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

再见!

于 2013-03-12T01:33:41.003 回答
1

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

还要检查标头中的时间戳,如果距 twitter 的服务器时钟 5 分钟,则请求将失败。

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

于 2012-11-30T10:08:16.627 回答
1

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

于 2012-11-30T19:30:06.760 回答