2012-11-30 1 views
1

J'ai OAuth mis en place avec passeport-twitter, et la connexion et l'authentification fonctionne bien. Le problème vient lorsque vous essayez de faire une demande autorisée, comme la mise à jour de l'état.faire des appels autorisés à Twitter API avec noeud-oauth et passeport

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

Donc cela économise le lecteur via mongoose et fonctionne. J'enregistre le jeton et le jetonSecret donnés par passeport, et supposons qu'ils ont été générés avec oAuth().getOAuthRequestToken() dans le cadre du rappel original de Twitter, et devraient donc être valides pour le reste de la session de connexion donnée. (? Peut-être une mauvaise prise en charge)

Plus tard, quand nous voulons tweet quelque chose pour l'utilisateur, ayant alla chercher le record du joueur et son secret jeton associé +:

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

La réponse à cette question est tout simplement l'état 401 et "Impossible d'authentifier avec OAuth."

Alors, est-ce qu'il me manque quelque chose d'important? Je n'ai pas encore creusé dans la source du passeport pour savoir ce que token et tokenSecret arguments sont réellement, mais demander ici en espérant que quelqu'un soulignerait la faille majeure dans le ci-dessus.

+0

trouvé les params réels étant affichés, ils semblent tous être là et raisonnable: POST /1/statuses/update.json HTTP/1.1 \ r Autorisation: 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" hôte: api.twitter.com – sbeam

Répondre

1

Essayez de voir si les paramètres de votre application sur dev.twitter.com sont configurés pour lire & write.

Vérifiez également l'horodatage dans l'en-tête, s'il est 5 minutes à l'horloge du serveur de Twitter, la demande échouera.

Vous pouvez également essayer une autre bibliothèque, j'ai utilisé node-oauth ou vous pouvez essayer ntwitter qui est basé sur node-oauth.

+0

bonnes idées, mais les paramètres sont corrects et l'heure du serveur est mis à jour avec ntp. passeport utilise 'node-oauth', c'est ce que j'utilise déjà. Je vais regarder dans ntwitter mais en espérant rester avec la pile que nous avons. Savez-vous s'il y a une étape de vérification qui est nécessaire avant l'appel '/ statuses/update', ou si le jeton/secret retourné par le passeport devrait être suffisant? – sbeam

+0

'ntwitter' aboutit également à un 401 (code 32) lorsqu'il est utilisé avec le même jeton/secret que celui obtenu dans le rappel' verify' ci-dessus dans 'TwitterStrategy'. Donc, il semble que quelque chose ne va pas avec la génération du jeton, aucune idée de ce que – sbeam

+0

Je vous suggère d'utiliser la version 1.1, car v1 est obsolète.Je sais que Twitter peut être une douleur dans le cul et leur message d'erreur est terrible. Je ne sais pas dans quelle mesure passe-twitter gère les rappels pour les requêtes request_token qui renvoient le oauth_verifier qui est nécessaire pour la requête access_token, mais à la fin j'ai fait cette logique avec oAuth, ceci combiné avec mon serveur étant 6 minutes hors de l'horloge, je l'ai eu pour travailler – Brmm

1

grâce @Brmm pour les bons conseils, mais dans ce cas il se trouve que nous utilisions différents comptes twitter dans les clés pour l'authentification et l'appel api, parce que, #bonehead

+0

Ensuite, vous devriez poster un commentaire ci-dessous sa réponse, pas de poster * une réponse *. –

1

Vous pouvez écrire.

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

et vous n'avez pas besoin d'une nouvelle instance Oauth. vous pouvez l'utiliser comme ça.

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!