2011-03-25 20 views
21

Sto cercando di far funzionare OAuth su node.js. Ho trovato questo nella documentazione del nodo OAuth:Problemi con OAuth su node.js

var OAuth= require('oauth').OAuth; 
var oa = new OAuth(requestUrl,accessUrl,consumerKey,consumerSecret,"1.0A",responseUrl,"HMAC-SHA1"); 

Il passo successivo nella official tutorial dice:

"Allora entrare in possesso di un token di accesso + accesso segreto gettone valido come per i canali normali "

Cosa sono questi " canali normali "?

So che l'utente deve autenticarsi in qualche modo sul sito "fornitore" e che in qualche modo viene chiamato un url di risposta, ma non riesco a trovare una descrizione su come implementarlo. Qualcuno può illuminarmi?

risposta

23

Non sono sicuro di quale servizio OAuth si sta tentando di connettersi, quindi userò semplicemente Twitter come esempio. Dopo aver creato l'oggetto OAuth è necessario prima richiedere un token oauth. Quando ottieni quel token, devi reindirizzare a, per Twitter, la loro pagina di autenticazione che li richiede di accedere, quindi chiede se è possibile che l'app effettui l'accesso.

oa.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, results){ 
    if (error) new Error(error.data) 
    else { 
    req.session.oauth.token = oauth_token 
    req.session.oauth.token_secret = oauth_token_secret 
    res.redirect('https://twitter.com/oauth/authenticate?oauth_token='+oauth_token) 
    } 
}); 

Quando hai creato l'oggetto OAuth per la prima volta, hai impostato un URL di risposta o l'url di richiamata. Può essere qualsiasi cosa, per la mia app è just/oauth/callback. In tale callback si riceve il token di verifica oauth. Quindi si utilizza il token di richiesta oauth e il token di verifica oauth per richiedere i token di accesso. Quando ricevi i token di accesso, riceverai anche qualcos'altro che passano, come il loro nome utente.

app.get('/oauth/callback', function(req, res, next){ 
    if (req.session.oauth) { 
    req.session.oauth.verifier = req.query.oauth_verifier 
    var oauth = req.session.oauth 

    oa.getOAuthAccessToken(oauth.token,oauth.token_secret,oauth.verifier, 
     function(error, oauth_access_token, oauth_access_token_secret, results){ 
     if (error) new Error(error) 
     console.log(results.screen_name) 
    } 
); 
} else 
    next(new Error('No OAuth information stored in the session. How did you get here?')) 
}); 

Spero che questo aiuti! Ho avuto gli stessi problemi quando ho iniziato su questo.

+0

Grazie mille per questo! Come l'hai capito? Prova ed errore o hai trovato un buon tutorial? – Thomas

+1

Non ho davvero trovato un tutorial. Pensato principalmente andando sulla documentazione di twitter oauth e rovistando attraverso la fonte del modulo oauth – mattmcmanus

2

Il token di accesso viene rilasciato per l'applicazione dopo aver camminato l'utente attraverso la "danza OAuth" (come è affettuosamente noto). Ciò significa ottenere un token di richiesta e reindirizzare l'utente al provider (Twitter, in questo caso) per l'autorizzazione. Se l'utente concede l'autorizzazione, Twitter reindirizza l'utente alla tua applicazione con un codice che può essere scambiato per un token di accesso.

node-oauth può essere utilizzato per gestire questo processo, ma una libreria di livello superiore renderà molto più semplice. Passport (di cui sono l'autore), è una di queste librerie. In questo caso, consulta la guida allo Twitter authentication, che semplifica la danza OAuth fino a poche righe di codice.

Dopodiché, è possibile salvare il token di accesso nel database e utilizzarlo per accedere alle risorse protette nel solito modo utilizzando node-oauth.

+0

, Passport.js fornisce qualche metodo per eseguire oauth su un proxy http? –

+1

C'è una patch per node-oauth qui: https://github.com/ciaranj/node-oauth/pull/108 Mi piacerebbe vederlo unito, che permetterebbe quello che stai chiedendo. –

+0

grazie a una tonnellata che aiuta !! –

0

Un aggiornamento per inviare tweet per cronologia utente:

@mattmcmanus, Estensione risposta @mattmcmanus bello, vorrei inviare un tweet per timeline. Per questo, sto usando lo stesso codice di mattcmanus dato sopra.

Fase 1:

oa.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, results){ 
    if (error) new Error(error.data) 
    else { 
    req.session.oauth.token = oauth_token 
    req.session.oauth.token_secret = oauth_token_secret 
    res.redirect('https://twitter.com/oauth/authenticate?oauth_token='+oauth_token) 
    } 
}); 

Fase 2:

app.get('/oauth/callback', function(req, res, next){ 
     if (req.session.oauth) { 
     req.session.oauth.verifier = req.query.oauth_verifier 
     var oauth = req.session.oauth 

     oa.getOAuthAccessToken(oauth.token,oauth.token_secret,oauth.verifier, 
      function(error, oauth_access_token, oauth_access_token_secret, results){ 
      if (error) new Error(error){ 
      console.log(results.screen_name) 
      }else{ 

       // NEW CODE TO POST TWEET TO TWITTER 
       oa.post(
       "https://api.twitter.com/1.1/statuses/update.json", 
       oauth_access_token, oauth_access_token_secret, 
       {"status":"Need somebody to love me! I love OSIpage, http://www.osipage.com"}, 
       function(error, data) { 
        if(error) console.log(error) 
        else console.log(data) 
       } 
       ); 
       // POST TWEET CODE ENDS HERE 

      } 
     } 
    ); 
    } else 
     next(new Error('No OAuth information stored in the session. How did you get here?')) 
    }); 

Ho aggiunto oauth_access_token & oauth_access_token_secret in codice commentato. Questo pubblicherà un aggiornamento di tweet sulla timeline dell'utente. Buon tweet !!!