¿Cómo implementar la autenticación JWT en la aplicación Express.js?

Token web JSON

Un token web JSON (JWT) es un objeto JSON que se utiliza para transferir información de forma segura a través de la web (entre dos partes). Generalmente se usa para sistemas de autenticación y también se puede usar para el intercambio de información.

Esto se usa para transferir datos con encriptación a través de Internet. Además, estos tokens pueden estar más seguros mediante el uso de una firma adicional. Estos tokens consisten en JSON de encabezado y JSON de carga útil junto con la firma opcional. Cada uno de los tres permanece concatenado con el “.”. A continuación se muestra el ejemplo de token web JSON. 

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2MTU0OWIwMTIwMWUyZjMzZWE3NmFkZjYiLCJlbWFpbCI6InNtdHdpbmtsZTQ1MkBnbWFpbC5jb20iLCJpYXQiOjE2MzI5MzQ2NTgsImV4cCI6MTYzMjkzODI1OH0._oHr3REme2pjDDdRliArAeVG_HuimbdM5suTw8HI7uc

Implementación de la autenticación JWT: JWT es muy popular para la autenticación y autorización a través de HTTP. Estos tokens se pueden usar como credenciales para otorgar permiso para acceder a los recursos del servidor.

¿Por qué necesitamos JWT en la autenticación? Como las requests HTTP no tienen estado, es una tarea desafiante saber que la solicitud actual está relacionada con la anterior. Por ejemplo, después de que un usuario inicie sesión tiene algunos derechos para cambiar sus datos, pero en la siguiente solicitud, el servidor identificará que es el mismo usuario que solicitó iniciar sesión anteriormente. Para resolver este desafío usamos JWT.

En el primer paso, el servidor genera un token con algunas configuraciones, es decir, carga útil, firma, caducidad, etc. La próxima vez que llegue una solicitud del lado del cliente con el encabezado de autorización que contiene el token JWT, el servidor decodifica ese token y usa el detalles, y permite el acceso en consecuencia.

Ejemplo: – Vamos a crear un servidor simple que tenga la funcionalidad de iniciar sesión y registrarse.

Paso 1: inicialice el servidor e instale el paquete JWT.

npm init
npm install jsonwebtoken

Paso 2: Crear ruta para tokens

Explicación:- 

  • Hemos importado express, mongoose y jsonwebtoken en la primera línea, y también el modelo User porque eso sería necesario para interactuar con la base de datos. En la siguiente línea, hemos llamado al método express que devuelve una aplicación con la que podemos configurar nuestro servidor. Estamos utilizando el middleware express.json al principio porque ese servidor puede identificar las requests entrantes como objetos JSON.
  • Después de eso, hemos creado dos rutas, una para iniciar sesión y otra para registrarse.
  • Dentro de la ruta de inicio de sesión, extrajimos el correo electrónico y la contraseña del cuerpo de la solicitud y luego buscamos al usuario en la base de datos, si se encuentra, procederemos a verificar si la contraseña proporcionada coincide con una contraseña real o no.
  • Dentro de la ruta de registro, hemos extraído detalles como el nombre, el correo electrónico y la contraseña para registrar a los usuarios en la base de datos, con el método de guardado proporcionado por la mangosta.

Finalmente, hemos creado un token con una caducidad de 1 hora al proporcionar la carga útil como identificación de usuario y correo electrónico porque solo esto es suficiente para extraer la información del usuario. El método de firma acepta la carga útil, la clave jwt secreta y el tiempo de caducidad, luego genera un token.

Nombre de archivo: app.js

Javascript

// Importing modules
const express = require("express");
const mongoose = require("mongoose");
 
const jwt = require("jsonwebtoken");
const User = require("./userModel");
 
const app = express();
 
app.use(express.json());
 
// Handling post request
app.post("/login", async (req, res, next) => {
  let { email, password } = req.body;
 
  let existingUser;
  try {
    existingUser = await User.findOne({ email: email });
  } catch {
    const error = new Error("Error! Something went wrong.");
    return next(error);
  }
  if (!existingUser || existingUser.password != password) {
    const error = Error("Wrong details please check at once");
    return next(error);
  }
  let token;
  try {
    //Creating jwt token
    token = jwt.sign(
      { userId: existingUser.id, email: existingUser.email },
      "secretkeyappearshere",
      { expiresIn: "1h" }
    );
  } catch (err) {
    console.log(err);
    const error = new Error("Error! Something went wrong.");
    return next(error);
  }
 
  res
    .status(200)
    .json({
      success: true,
      data: {
        userId: existingUser.id,
        email: existingUser.email,
        token: token,
      },
    });
});
 
// Handling post request
app.post("/signup", async (req, res, next) => {
  const { name, email, password } = req.body;
  const newUser = User({
    name,
    email,
    password,
  });
 
  try {
    await newUser.save();
  } catch {
    const error = new Error("Error! Something went wrong.");
    return next(error);
  }
  let token;
  try {
    token = jwt.sign(
      { userId: newUser.id, email: newUser.email },
      "secretkeyappearshere",
      { expiresIn: "1h" }
    );
  } catch (err) {
    const error = new Error("Error! Something went wrong.");
    return next(error);
  }
  res
    .status(201)
    .json({
      success: true,
      data: { userId: newUser.id,
          email: newUser.email, token: token },
    });
});
 
//Connecting to the database
mongoose
  .connect("mongodb://localhost:27017/testDB")
  .then(() => {
    app.listen("3000", () => {
      console.log("Server is listening on port 3000");
    });
  })
  .catch((err) => {
    console.log("Error Occurred");
  });

Salida: Estamos probando nuestra API con Postman, hemos proporcionado los datos para el registro en el cuerpo de la solicitud y, finalmente, obtenemos nuestro token con algunos otros detalles.

Paso 3: Decodificación del token JWT

  • Podemos recibir nuestra solicitud con un token para otorgar los permisos, aquí mostramos un ejemplo simple de cómo se está decodificando un token.
  • El token se envía por encabezado de solicitud, estamos extrayendo el token aquí del encabezado de autorización, estamos usando la función de división porque el token permanece en forma de «Token de portador» y solo queremos extraer el token, por eso proporcionamos el índice 1 .
  • El método de verificación acepta el token y la clave jwt y proporciona la decodificación del token. Después de esto, podemos obtener la información del usuario.

Javascript

app.get('/accessResource', (req, res)=>{  
    const token = req.headers.authorization.split(' ')[1]; 
    //Authorization: 'Bearer TOKEN'
    if(!token)
    {
        res.status(200).json({success:false, message: "Error!
                       Token was not provided."});
    }
    //Decoding the token
    const decodedToken = jwt.verify(token,"secretkeyappearshere" );
    res.status(200).json({success:true, data:{userId:decodedToken.userId,
     email:decodedToken.email});   
})

Salida: aquí estamos probando la API que es responsable de aceptar el token, hemos pasado el token en el encabezado y finalmente el servidor decodifica los detalles del usuario.

Conclusión: con esto hemos implementado con éxito el token desde la creación hasta la decodificación. Este ejemplo de la ruta ‘ accessResource ‘ es suficiente para ilustrar el funcionamiento, puede usar internamente su token de la manera que desee y puede permitir al usuario en consecuencia. Todo esto significa que podemos persistir con éxito la información de las requests HTTP sin estado.

Publicación traducida automáticamente

Artículo escrito por mrtwinklesharma y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *