Sebastian Durandeu Blog

  • Visitantes

Archive for November, 2013

Node.js: Estrategia de Passport.js para MercadoLibre

Posted by sebastiandurandeu on November 24, 2013

logo-ml

Passport.js es actualmente el standard de facto para autenticación en aplicaciones Node.js que utilizan Express (gracias @eugenio_pace). Lo interesante es que se puede configurar fácilmente para que los usuarios se puedan autenticar con distintos ‘autentication providers’ (como GitHub, Google, Facebook, etc.). Esta configuración e integración se realiza a través del uso de estrategias – la lista completa de estrategias disponibles esta acá (son +140).

Esta 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 de MercadoLibre en aplicaciones Node.js. Esto a su vez, es necesario si queremos utilizar las partes seguras de la API de MercadoLibre.

La estrategia la pueden encontrar en:

Sino acá abajo dejo los pasos para utilizarla con Express:

1. Primero debemos registrar una app en la plataforma para desarrolladores de MercadoLibre acá.

2. Instalar el paquete con npm en la aplicación Node.js.

npm install passport-mercadolibre

3. Configurar la estrategía con Passport.js. Para esto tenemos que:

  • Agregar la estrategía a Passport, utilizando passport.use(), pasando el client id y secret que se obtiene de MercadoLibre.
  • Junto con esto, proveer una ‘verify callback’ que recibe la información del usuario de MercadoLibre (profile), incluyendo información como el el nickname, first_name, last_name, etc. y los tokens (accessToken y refreshToken), con la cual si necesito, podría ir mi base de datos a verificar si usuario ya esta registrado o traer mas información del mismo.
  • Dos funciones passport.serializeUser()passport.deserializeUser() para serializar y deserializar el usuario en la cookie de autenticación que maneja Passport.js.
var MercadoLibreStrategy = require('passport-mercadolibre').Strategy;

passport.use(new MercadoLibreStrategy({
    clientID: 'YOUR_CLIENT_ID',
    clientSecret: 'YOUR_CLIENT_SECRET',
    callbackURL: 'http://www.example.com/auth/mercadolibre/callback',
  },
  function (accessToken, refreshToken, profile, done) {
    // + store/retrieve user from database, together with access token and refresh token
    return done(null, profile); 
  }
));

passport.serializeUser(function (user, done) {
  done(null, user);
});

passport.deserializeUser(function (user, done) {
  done(null, user);
});

4. Posteriormente debemos definir las rutas de autenticación (asumiendo que estamos utilizando Express).

app.get('/auth/mercadolibre',
  passport.authorize('mercadolibre'));

app.get('/auth/mercadolibre/callback', 
  passport.authorize('mercadolibre', { failureRedirect: '/login' }),
  function(req, res) {
    // Successful authentication, redirect home.
    res.redirect('/');
  });

5. En este punto ya tenemos la estrategia configurada, y lista para requerir autenticación en las rutas de Express. Por ejemplo en la ruta ‘/’ de abajo nos aseguramos que el usuario este logeado con MercadoLibre antes de dejarlo acceder.

app.get('/', ensureAuthenticated, 
  function(req, res) {
    res.send("Logged in user: " + req.user.nickname);
  }
);

function ensureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) { 
    return next(); 
  };
  res.redirect('/auth/mercadolibre');
};

passport-mercadolibre-usage
Tener en cuenta que el objecto user tiene la información del perfil del usuario de MercadoLibre, incluye las siguientes propiedades pero se pueden obtener mas utilizando la propiedad _json. Ver la lista completa acá.

  • provider (mercadolibre)
  • nickname
  • first_name
  • last_name
  • email
  • accessToken
  • _raw (raw server response)
  • _json (JSON object with server response)

WARNING

Momentáneamente, debido a un bug (creo) de una de las dependencias de Passport.js, para que la estretegia funcione correctamente hay que hacer una modificación manual en un archivo. Vean la modificación acá.

Advertisements

Posted in Node.js | Leave a Comment »