Sebastian Durandeu Blog

  • Visitantes

Node.js: OAuth 2.0 con la API de MercadoLibre

Posted by sebastiandurandeu on October 2, 2013

Estuve haciendo unas pruebas con la API de MercadoLibre desde Node.js. En particular, quise probar como autenticar contra la API usando OAuth 2.0, siguiendo los pasos descriptos acá.

Los módulos de Node que voy a utilizar en este código son:

1) El primer paso es definir una ruta para comenzar el flow de OAuth (en este caso ‘/auth/mercadolibre’) y obtener el authorization code. En este paso tengo que hacer un redirect al authorization endpoint de la API enviando los siguientes datos:

  • client_id: El app id de mi aplicación,que puedo obtener acá.
  • redirect_uri: Una URL a donde mi app va a recibir el authorization code y procesarlo (AKA redirection endpoint). En este caso es ‘/auth/mercadolibre/callback’.

En este paso el usuario va a ver el dialogo de login de Mercado Libre y va a autorizar a nuestra app a acceder a sus datos.

app.get('/auth/mercadolibre', function (req,res) {
    var authCallback = GetBaseUrl() + '/auth/mercadolibre/callback';
    var redirectUrl = util.format('https://auth.mercadolibre.com.ar/authorization?response_type=code&client_id=%s&redirect_uri=%s',
    config.clientId, authCallback);
    res.redirect(redirectUrl);
});

2) El segundo paso es utilizar el access code del paso anterior para obtener un access token que finalmente me va a permitir realizar requests a la API. Para esto tengo que hacer un HTTP POST al Token Endpoint de la API (‘/oauth/token’) para finalmente obtener el access token. Los parámetros de este request son:

  • client_id: El app id de mi aplicación, que puedo obtener acá
  • client_secret: El app secret de mi aplicación, idem
  • code: El access code obtenido en el paso 2
  • redirect_uri: La misma redirect_uri que pasamos en el paso 2
app.get('/auth/mercadolibre/callback', function (req,res) {
    var code = req.query.code;
    var authcallback = GetBaseUrl() + '/auth/mercadolibre/callback';
    var accessTokenUrl = util.format('https://api.mercadolibre.com/oauth/token?grant_type=authorization_code&client_id=%s&client_secret=%s&code=%s&redirect_uri=%s',
    config.clientId, config.clientSecret, code, authcallback);
    request.post(accessTokenUrl, function(error, response, body) {
        res.send(body);
    });
});

Bien, ahora si corro mi app y browseo a ‘/auth/mercadolibre’, pasado el login y los redirects, debería obtener un JSON con el access token. Algo parecido a lo siguiente.

authComplete

3) Para mantener la explicación simple, el siguiente código muestra como se puede usar manualmente en un request el access token obtenido para obtener la dirección de un usuario de mercado libre.

app.get('/:user/address', function (req, res) {
    var userId = req.params.user;
    var apiUrl = util.format('https://api.mercadolibre.com/users/%s/addresses?access_token=%s', userId, '{copiar_el_access_token_acá}');
    request.get(apiUrl, function(error, response, body) {
        res.send(body);
    });
});

Tengan en cuenta que no toda la funcionalidad de la API requiere que estemos autenticados. Por ejemplo las búsquedas, se pueden realizar sin necesidad de autenticación.

LA MAGIA

Por algún motivo desconocido aún por mi (y un poco de vago) nada de esto anda si no configuro el módulo HTTPS de la siguiente manera:

https.globalAgent.options.secureProtocol = 'SSLv3_method';

Para mas info de OAuth 2, me gustó el diagrama que tiene la RFC acá. Como siempre el feedback es bienvenido 🙂

Advertisements

2 Responses to “Node.js: OAuth 2.0 con la API de MercadoLibre”

  1. Nice! estas a un paso de encapsular todo esto en una estrategia de passport.js, que es algo asi como el standard “de facto” para autenticacion en aplicaciones nodejs. Hay montones de ejemplos aca: http://passportjs.org

  2. […] vez, utilizando el código que armé para éste post anterior, cree una estrategia de autenticación que permite que los usuarios se autentiquen con sus cuentas […]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: