1

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

したがって、これはマングースを介してプレーヤーを保存し、機能します。パスポートによって与えられた token と tokenSecret を保存し、それらがoAuth().getOAuthRequestToken()Twitter からの元のコールバックの一部として生成されていると想定し、指定されたログイン セッションの残りの部分で有効である必要があります。(もしかしたら悪い仮定?)

後で、ユーザーのために何かをツイートしたい場合は、Player レコードとそれに関連付けられた token+secret をフェッチします。

 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 で認証できませんでした」だけです。

それで、私は何か重要なものを見逃していますか?私はまだパスポートのソースを掘り下げて実際に何が議論されているのかを調べる必要がtokenありtokenSecretますが、誰かが上記の主要な欠陥を指摘してくれることを期待してここに尋ねます.

4

3 に答える 3

1

dev.twitter.comのアプリケーション設定が読み取りと書き込みに設定されているかどうかを確認してください。

また、ヘッダーのタイムスタンプを確認してください。Twitterのサーバークロックから5分ずれていると、リクエストは失敗します。

別のライブラリを試すこともできます。私はnode-oauthを使用しました。または、node-oauthに基づくntwitterを試すこともできます。

于 2012-11-30T10:08:16.627 に答える
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

良いアドバイスをくれた@Brmmに感謝しますが、この場合、認証とAPI呼び出しのキーで異なるTwitterアカウントを使用していたことがわかりました。

于 2012-11-30T19:30:06.760 に答える