En este artículo, veremos cómo crear y verificar tokens JWT en Node.js.
requisitos previos:
- Buen conocimiento de JavaScript .
- Conocimientos básicos sobre ExpressJs .
- Conocimientos básicos sobre Autenticación API .
- Conocimientos básicos sobre cartero y sus usos.
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