¿Cómo crear y verificar JWT con Node.js?

En este artículo, veremos cómo crear y verificar tokens JWT en Node.js.

requisitos previos:

En el desarrollo web, también queremos asegurar nuestra ruta, por lo que tenemos 3 tipos de formas de asegurar nuestra ruta: cookies, sesión o autenticación API. Las cookies y la sesión solo funcionan con el navegador si desea rutas seguras en los puntos finales de la API. Por lo tanto, debe necesitar el mecanismo de autenticación de la API. O en la actualidad, trabajamos principalmente con API, por lo que es esencial crear puntos finales de API seguros. La forma más popular en la autenticación de API es el uso de JsonWebToken, el trabajo con muchos tipos de tecnologías y también con NodeJs. En este artículo, hemos creado algunos puntos finales de API ficticios con la ayuda de ExpressJs y aseguramos sus rutas con la ayuda del mecanismo de token JWT y comprendemos cómo funcionan y verificamos los tokens. La abreviatura de JsonWebtoken es JWT.

Enfoque: antes de comenzar el artículo, discutiremos aquí los detalles del problema del artículo, estamos hablando del método más popular para proteger los puntos finales de la API. Que proporciona JWT. Primero configuraremos NodeJs para escribir nuestro código, luego veremos cómo crear y verificar el token JWT, finalmente, veremos el resultado de nuestra API con la ayuda de Postman API Testing Tool.

Implementación paso a paso:

Paso 1: primero configure el proyecto NodeJs. Si no tiene NodeJs o NPM , consulte este artículo. Inicie el proyecto NodeJs con npm.

npm init -y

“-y” para marcar todas las respuestas a las preguntas como predeterminadas.

Después de iniciar el proyecto NodeJs, vaya al segundo paso.

Paso 2: después de iniciar el proyecto, instale algunas dependencias. Instale express y jsonwebtoken a través de npm

npm install express jsonwebtoken

Paso 3: Instale nodemon como una dependencia de desarrollo.

npm install -d nodemon

Estructura del proyecto: una vez completada la instalación, cree un archivo index.js y ahora la estructura de su directorio se ve así.

Paso 4: agregue una secuencia de comandos más en el archivo package.json. Abra el archivo package.json y agregue una línea a continuación al script de prueba.

Paso 5: antes de crear y verificar el punto final de la API con la ayuda de JWT, y expréselo primero, escriba un código para su uso posterior.

Nombre de archivo: index.js

Javascript

// Import express for creating API's endpoints
const express = require('express');
 
// Import jwt for API's endpoints authentication
const jwt = require('jsonwebtoken');
 
// Creates an Express application, initiate
// express top level function
const app = express();
 
// A port for serving API's
const port = 3000;
 
 
// A demo get route
app.get('/', (req, res) => {
    res.json({
        route: '/',
        authentication: false
    });
});
 
 
// Listen the server
app.listen(port, () => {
    console.log(`Server is running : http://localhost:${port}/`);
});

 
Paso 6: después de que el código ficticio esté listo, cree un objeto de base de datos json y almacene algunos datos ficticios.

Nombre de archivo: index.js

Javascript

// A fake database object.
let databse = [
    {
        name: 'gfg',
        work: 'knowledge provider',
        password: 'abc'
    },
    {
        name: 'suryapratap',
        work: 'technical content writer',
        password: '123'
    }
];

 
Paso 7: permitir que los datos JSON se comuniquen con la API. Permita los datos JSON en una solicitud agregando middleware para el analizador de cuerpo.

Nombre de archivo: index.js

Javascript

// Allow json data
app.use(express.json());

 
Paso 8: Cree una ruta de inicio de sesión y cree un token JWT. Aquí, cree una ruta de publicación de inicio de sesión y cree un token JWT y devuélvalo a la respuesta. Lea los comentarios del código para una mejor comprensión.

Nombre de archivo: index.js

Javascript

// Login route.
app.post('/login', (req, res) => {
 
    // Get the name to the json body data
    const name = req.body.name;
 
    // Get the password to the json body data
    const password = req.body.password;
 
    // Make two variable for further use
    let isPresent = false;
    let isPresnetIndex = null;
 
    // Iterate a loop to the data items and
    // check what data are method
    for(let i=0; i<databse.length; i++){
 
        // If data name are matched so check
        // the password are correct or not
        if(databse[i].name === name &&
        databse[i].password === password){
 
            // If both are correct so make
            // isPresent variable true
            isPresent = true;
 
            // And store the data index
            isPresnetIndex = i;
 
            // Break the loop after matching
            // successfully
            break;
        }
    }
 
    // If isPresent is true, then create a
    // token and pass to the response
    if(isPresent){
 
        // The jwt.sign method are used
        // to create token
        const token = jwt.sign(
            databse[isPresnetIndex],
            'secret'
        );
         
        // Pass the data or token in response
        res.json({
            login: true,
            token: token,
            data: databse[isPresnetIndex]
        });
    }else{
 
        // If isPresent is false return the error
        res.json({
            login: false,
            error: 'please check name and password.'
        });
    }
});

 
Paso 9: el método de signo JWT se utiliza para crear un token. Se toman tres argumentos, uno es un objeto de respuesta, el segundo es una clave secreta y el último es un objeto de opciones para un mejor uso del token.

Nombre de archivo: index.js 

Javascript

jwt.sign(
    {data_obeject},
    "secret_key",
    {Options}
)

 
Si desea obtener más información sobre el método jwt.sign, consulte la documentación oficial. 

Paso 10: Ahora haremos otra ruta para la autenticación del token jwt. Aquí, creamos una ruta de autenticación y autenticamos el token JWT que viene.

Nombre de archivo: index.js

Javascript

// Verify route
app.get('/auth', (req, res) => {
 
    // Get token value to the json body
    const token = req.body.token;
 
    // If the token is present
    if(token){
 
        // Verify the token using jwt.verify method
        const decode = jwt.verify(token, 'secret');
 
        //  Return response with decode data
        res.json({
            login: true,
            data: decode
        });
    }else{
 
        // Return response with error
        res.json({
            login: false,
            data: 'error'
        });
    }
});

 
Paso 11: el método de verificación de JWT se usa para verificar que el token toma dos argumentos, uno es el valor de la string del token y el segundo es la clave secreta para hacer coincidir que el token sea válido o no. El método de validación devuelve un objeto de decodificación en el que almacenamos el token.

Nombre de archivo: index.js 

Javascript

jwt.verify(token_value, 'secret_key');

 
Si desea obtener más información sobre el método jwt.verify, consulte la documentación oficial.

A continuación se muestra el código completo de la implementación paso a paso anterior:

Nombre de archivo: index.js

Javascript

// Import express for creating API's endpoints
const express = require("express");
 
// Import jwt for API's endpoints authentication
const jwt = require("jsonwebtoken");
 
// Creates an Express application, initiate
// express top level function
const app = express();
 
// A port for serving API's
const port = 3000;
 
// A fake database object
let databse = [
  {
    name: "gfg",
    work: "knowledge provider",
    password: "abc",
  },
  {
    name: "suryapratap",
    work: "technical content writer",
    password: "123",
  },
];
 
// A demo get route
app.get("/", (req, res) => {
  res.json({
    route: "/",
    authentication: false,
  });
});
 
// Allow json data
app.use(express.json());
 
// Login route
app.post("/login", (req, res) => {
 
  // Get the name to the json body data
  const name = req.body.name;
 
  // Get the password to the json body data
  const password = req.body.password;
 
  // Make two variable for further use
  let isPresent = false;
  let isPresnetIndex = null;
 
  // iterate a loop to the data items and
  // check what data are matched.
  for (let i = 0; i < databse.length; i++) {
 
    // If data name are matched so check
    // the password are correct or not
    if (databse[i].name === name
      && databse[i].password === password) {
 
      // If both are correct so make
      // isPresent variable true
      isPresent = true;
 
      // And store the data index
      isPresnetIndex = i;
 
      // Break the loop after matching successfully
      break;
    }
  }
 
  // If isPresent is true, then create a
  // token and pass to the response
  if (isPresent) {
 
    // The jwt.sign method are used
    // to create token
    const token = jwt.sign(databse[isPresnetIndex], "secret");
 
    // Pass the data or token in response
    res.json({
      login: true,
      token: token,
      data: databse[isPresnetIndex],
    });
  } else {
 
    // If isPresent is false return the error
    res.json({
      login: false,
      error: "please check name and password.",
    });
  }
});
 
// Verify route
app.get("/auth", (req, res) => {
 
  // Get token value to the json body
  const token = req.body.token;
 
  // If the token is present
  if (token) {
 
    // Verify the token using jwt.verify method
    const decode = jwt.verify(token, "secret");
 
    //  Return response with decode data
    res.json({
      login: true,
      data: decode,
    });
  } else {
 
    // Return response with error
    res.json({
      login: false,
      data: "error",
    });
  }
});
 
// Listen the server
app.listen(port, () => {
  console.log(`Server is running :
    http://localhost:${port}/`);
});

Paso para probar las rutas: Usaremos Postman para probar las rutas de la API. En primer lugar, pruebe la ruta de inicio de sesión. Abra el cartero y realice una solicitud de publicación en la ruta ‘/login’ con los datos JSON apropiados.

Use la dirección localhost y realice una solicitud posterior en la ruta / inicio de sesión y envíe los datos apropiados en formato json y, finalmente, obtendrá una respuesta JSON con el estado de inicio de sesión y el token o los datos del objeto. Use el token para la autenticación de los puntos finales de la API y vuelva a usar la dirección localhost y realice una solicitud de obtención en la ruta ‘/auth’ y envíe el token de datos apropiado.

Después de la validación, obtendrá el almacén de objetos de datos adecuado en el token.

Publicación traducida automáticamente

Artículo escrito por mrsuryapratap 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 *