2011-03-25 16 views
21

que estoy tratando de conseguir OAuth para trabajar en node.js. He encontrado esto en la documentación del nodo-oauth:Problemas con OAuth en Node.js

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

El siguiente paso en el official tutorial dice:

"Entonces hacerse con un token de acceso + secreto de acceso token válido según los canales normales "

¿Cuáles son estos " canales normales "?

Sé que el usuario tiene que autenticarse de alguna manera en el sitio "proveedor" y que de alguna manera se llama una url de respuesta, pero no puedo encontrar una descripción de cómo implementar esto. ¿Alguien me puede iluminar?

Respuesta

23

no estoy seguro de lo que el servicio de OAuth que está intentando conectarse a así que voy a usar Twitter como un ejemplo. Después de crear su objeto OAuth, primero debe solicitar un token oauth. Cuando te llega ese modo, entonces usted necesita para redirigir a, por Twitter, su página de autentificación que o bien se les pide que iniciar sesión, y luego le pregunta si es aceptable para la aplicación para iniciar sesión.

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

Cuando creó por primera vez el objeto OAuth, establece una responseURL, o la URL de devolución de llamada. Puede ser cualquier cosa, para mi aplicación es solo/oauth/callback. En esa devolución de llamada, recibe el token del verificador oauth. A continuación, utiliza los tokens de solicitud de oauth y de oauth verifier para solicitar los tokens de acceso. Cuando reciba los tokens de acceso, también recibirá cualquier otra cosa que pase, como su nombre de usuario.

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

Hope this helps! Tuve los mismos problemas cuando comencé esto.

+0

¡Muchas gracias por esto! ¿Cómo lo descubriste? Prueba y error o ¿encontró un buen tutorial? – Thomas

+1

Realmente no encontré un tutorial. Lo averiguó sobre todo yendo a la documentación de twitter o revisando la fuente del – mattmcmanus

2

El testigo de acceso se emite para su aplicación después de caminar el usuario a través de la "danza OAuth" (como cariñosamente conocido). Esto significa obtener un token de solicitud y redirigir al usuario al proveedor (Twitter, en este caso) para autorización. Si el usuario otorga la autorización, Twitter redirecciona al usuario a su aplicación con un código que puede intercambiarse por un token de acceso.

nodo-oauth se puede utilizar para gestionar este proceso, pero una biblioteca de más alto nivel hará que sea mucho más fácil. Passport (del cual soy el autor), es una de esas bibliotecas. En este caso, consulte la guía Twitter authentication, que simplifica la danza OAuth hasta unas pocas líneas de código.

Después de eso, puede guardar el token de acceso en su base de datos y usarlo para acceder a recursos protegidos de la manera habitual utilizando nodo-oauth.

+0

del módulo de Oauth ¿proporciona Passport.js algún método para hacer oauth sobre un proxy http? –

+1

Hay un parche para node-oauth aquí: https://github.com/ciaranj/node-oauth/pull/108 Me gustaría ver que se fusionó, lo que permitiría lo que está pidiendo. –

+0

gracias una tonelada que ayuda !! –

0

una actualización para enviar tweet a la línea de tiempo del usuario:

@mattmcmanus, Extendiendo respuesta @mattmcmanus agradable, me gustaría publicar un tweet a la línea de tiempo. Para esto, estoy usando el mismo código que mattcmanus dado anteriormente.

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

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

He añadido oauth_access_token & oauth_access_token_secret en código comentado. Esto publicará una actualización de tweet en la línea de tiempo del usuario. ¡Feliz tweeting!