Sessions en ExpressJS

  • Autentificación: Es el proceso por el cual se verifica que el usuario es quien él dice ser.
  • Autorización: Es el proceso de determinar si el usuario tiene permisos para acceder a los datos o archivos que el ha solicitado.

A continuación se le mostrará un ejemplo muy sencillo de una autentificación y una autorización usando session in express.js. Hay un punto para loguearte y un punto para desloguearte y un método get que te muestra la página. Para ver la página publicada deberás estar logueado primero, además tu identidad será verificada y guardada en dicha sesión. Cuándo te desloguees de la página sucederá que: te rechazará el acceso borrando tu identidad de la sesión.

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

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

// 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!");
  }
});

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

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

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

Para probar el código pondríamos en la línea de comandos:

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

Además tendríamos que visitar los siguientes urls en el navegador:

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

Se explicará brevemente el funcionamiento del código:

En este primer fragmento de código lo que se realiza es que se importan los módulos de express y express-session, se crea la aplicación de express y se añade la sesión a express como un middleware.

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

Aquí se realiza la función del middleware autentificación y autorización. El siguiente paso que realiza es mirar si el usuario es "amy" y si ella tiene permisos para verificarse. El valor para mirarlo esta hecho con el propósito de ser una demostración, en una aplicación web de verdad obtendría la autentificación y la autorización desde la sesión y lo compararía con una database que se encontraría en el 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);
};

A continuación mostramos lo que sería el Query String del navegador para explicar los fragmentos de código:

localhost:3000/login?username=amy&password=amyspassword sería la URL que guardaría la autorización y verificación del usuario en la sesión. La sesión será diferente para cada usuario y única para el mismo usuario usando diferentes navegadores. Por ejemplo, si el mismo usuario se ha logueado usando Chrome, y se quiere loguear con Firefox el usuario deberá loguearse de nuevo en Firefox para obtener otra vez la protección adecuada. Una aplicación web real normalmente enviaría la solicitud y pasaría los datos por un formulario de envío. Aquí se ha hecho de forma que sirva para la demostración. La aplicación real miraría el usuario y su password en la database del 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!");
  }
});

Aquí se explica el punto de deslogueo utilizando el query string del navegador:

localhost:3000/logout, el deslogueo destruirá la sesión, es decir, borrará la identidad del usuario, por lo tanto si el usuario quiere volver a entrar deberá loguearse de nuevo para obtener la seguridad proporcionada.

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

localhost:3000/content, es el query string que mostraría el contenido de la página web. La función de autorización es pasada en el segundo parámetro como un middleware antes de que se proceda a mostrar el contenido al usuario en cuestión. Si la función de autorización determina que el usuario no es válido no se pasará a la tecera función que es la que muestra el contenido al usuario.

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

Por último dejaríamos la aplicación escuchando en el puerto 3000.

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

results matching ""

    No results matching ""