Autenticación en node.js usando express.js

Antes de comenzar a explicar el procedimiento de autenticación en node.js hay que tener claros dos conceptos:

  • La autenticación es el proceso de verificar si un usuario es, de hecho, el usuario que ha dicho ser.

  • La autorización es el proceso de determinar si el usuario tiene los privilegios necesarios para acceder a los recursos que ha solicitado.

El siguiente fragmento de código node.js muestra un ejemplo muy básico del proceso de autenticación y autorización usando el módulo session de express.js. Hay un punto final de inicio de sesión, un punto final de cierre de sesión y obetener página de entrada. Para ver la página de entrada, primero hay que iniciar sesión, y la identidad del usuario será verificada y guardada en la sesión. Cuando el usuario cierra la sesión, su acceso será negado eliminando su identidad de la sesión.

El código paso a paso

Primero importamos los módulos express y express-session. Después creamos express app y añadimos la sesión a express app como un middleware.

var express = require('express'),
    app = express(),
    session = require('express-session');
app.use(session({
    secret: '2C44-4D44-WppQ38S',
    resave: true,
    saveUnitialized: true
}));

Función middleware para autenticación y autorización. Permite el siguiente paso si el usuario es 'amy' y si tiene acceso de administrador. Estos valores son solo para esta demostración. Una aplicación web real obtendrá el usuario y su nivel de acceso de la sesión, y comprobará el usuario y su nivel de acceso en un base de datos del servidor.

// Authentication and Authorization Middleware
var auth = function(req, res, next) {
  if (req.session && req.session.user === "amy" && req.session.admin)
    return next();
  else
    return res.sendStatus(401);
};

localhost:3000/login?username=amy&password=amyspassword, la url de inicio de sesión para comprobar el inicio de sesión del usuario guardando el usuario y su nivel de acceso en una sesión. La sesión será diferente para cada usuario, y también única para el mismo usuario usando diferentes navegadores. Para el ejemplo, usamos una petición get y le pasamos la información mediante parámetros query. Un aplicación web real usaría una petición post y pasaría los datos en forma post. En el ejemplo también vemos que el usuario y la contraseña están codificados. En un aplicación real se comprobaría el usuario y la contraseña en una base de datos en el servidor.

// Login endpoint
app.get('/login', function (req, res) {
  if (!req.query.username || !req.query.password) {
    res.send('login failed');    
  } else if(req.query.username === "amy" || req.query.password === "amyspassword") {
    req.session.user = "amy";
    req.session.admin = true;
    res.send("login success!");
  }
});

localhost:3000/logout, cierra la sesión eliminandola. Una vez la sesión es elminada, el usuario tiene que introducir la url de inicio de sesión otra vez para conseguir acceso a recursos protegidos.

// Logout endpoint
app.get('/logout', function (req, res) {
  req.session.destroy();
  res.send("logout success!");
});

localhost:3000/content, obtiene los contenidos protegidos. La función de autenticación se pasa como segundo parámetro del middleware antes de que proceda a enviar el contenido al usuario. Si la función de autenticación determina que el usuario no es válido, no ejecuta la tercera función para enviar el contenido.

// Get content endpoint
app.get('/content', auth, function (req, res) {
    res.send("You can only see this after you've logged in.");
});

Por último, escuchar en el puerto 3000.

app.listen(3000);
console.log("app running at http://localhost:3000");

Ejecutando el código

Primero guardar cada paso en un fichero session_auth.js.

Para ejecutar el código:

npm install express
npm install express-session
node session_auth.js &

Escribir en el navegador:

  • localhost:3000/content
  • localhost:3000/login?username=amy&password=amyspassword
  • localhost:3000/content
  • localhost:3000/logout
  • localhost:3000/content

results matching ""

    No results matching ""