2012-11-30 28 views
1

我的OAuth设置了护照,Twitter和登录和认证工作正常Twitter的API调用。尝试执行授权请求(如更新状态)时会出现问题。使授权与节点的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)                              
     }                                 
     })                                 
    }                                  
    )) 

所以这节省了玩家通过猫鼬和工作。我节省护照给令牌和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论点实际上是,但要求在这里希望有人会指出,在上述重大缺陷。看到

+0

发现实际PARAMS被张贴,他们似乎都在那里,合理: POST /1/statuses/update.json HTTP/1.1 \ r 授权:OAuth的 oauth_consumer_key = “QtYPhe8Es3ohYs69JhR9UQ”,oauth_nonce =” 9ywy2s eTxJPFobX5vaYWahoU0v1QVd4a”,oauth_signature_method = “HMAC-SHA1”,oauth_timestamp = “1354253395”,组oauth_token = “17236341-ldvJkClcdwbk1Naax7KBHRgwso7o4 GtzxGpLPAks”,oauth_version = “1.0”,oauth_signature = “Ut5XGNA0Za4PlVQkgXoMJELY0Jo%3D” 主机:api.twitter.com – sbeam

回答

1

尝试,如果在你的dev.twitter.com应用程序设置都设置为只读&写。

还要检查在报头中的时间戳,如果它的500分钟关到Twitter的服务器时钟请求将失败。

您也可以尝试其他库,我已经使用node-oauth或者您可以尝试ntwitter,它基于node-oauth。

+0

好主意,但设置是正确的,服务器时间用ntp更新。护照使用'node-oauth',所以这就是我已经使用的。我会看看ntwitter,但希望能留下我们的堆叠。你知道在'/ statuses/update'调用之前是否需要验证步骤,或者从护照返回的令牌/秘密应该足够好吗? – sbeam

+0

当我们在'TwitterStrategy'上面的'verify'回调中获得相同的标记/秘密时,'ntwitter'还会产生一个401(代码32)。所以看起来代码有问题,不知道 – sbeam

+0

我建议你使用版本1.1,因为v1已经被弃用了。我知道推特可能是一个痛苦的屁股,他们的错误信息是可怕的。我不知道passport-twitter处理函数对request_token请求的回调有多远,它返回access_token请求所需的oauth_verifier,但最终我用oAuth自己完成了这个逻辑,这与我的服务器结合了6分钟关闭时钟,我得到它的工作 – Brmm

1

感谢@Brmm了很好的意见,但在这种情况下,事实证明我们是在认证和API调用键使用不同的Twitter账户,因为,#bonehead

+0

然后,你应该发表评论下面的答案,而不是发布*答案*。 –

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

ciao!