En este blog, implementaremos la autenticación con JWT en una aplicación web NodeJS. Para esto, usaremos jsonwebtoken paquete
¿Qué es JWT?
JWT (JSON Web Token) es un formato de token. Está firmado digitalmente, es autónomo y compacto. Proporciona un mecanismo conveniente para transferir datos. JWT no es intrínsecamente seguro, pero el uso de JWT puede garantizar la autenticidad del mensaje siempre que se verifique la firma y se pueda garantizar la integridad de la carga útil. JWT se usa a menudo para la autenticación sin estado en casos de uso simples que involucran sistemas no complejos.
Aquí hay un ejemplo de JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm
Ahora, vamos a autenticar/proteger algunas rutas.
Requisitos previos:
- Conocimientos básicos de HTML/JavaScript
- NodeJS debe estar instalado en su sistema.
- módulo express para la creación del servidor.
- módulo mongoose para conexión y consultas MongoDB.
- módulo bcrypt para hash.
puede instalar todos los paquetes requeridos usando el siguiente comando:
npm install express mongoose bcrypt --save
Paso 1. Primero, cree una estructura de directorios como se muestra a continuación:
JWTApp
-api
--models
----userModel.js
--controllers
----userController.js
--route
----userRoute.js
--server.js
Paso 2. Instale “jsonwebtoken ” paquete usando el siguiente comando
npm install jsonwebtoken -- save
Paso 3. Crear el modelo de usuario
En la carpeta api/models, cree un archivo llamado usuario userModel.js ejecutando touch api/models/userModel.js.
En este archivo, cree un esquema de mangosta con las siguientes propiedades:
- nombre completo
- dirección de correo electrónico
- contraseña
- la fecha de creación
Agrega el siguiente código
'use strict';
var mongoose = require('mongoose'),
bcrypt = require('bcrypt'),
Schema = mongoose.Schema;
/**
* User Schema
*/
var UserSchema = new Schema({
fullName: {
type: String,
trim: true,
required: true
},
email: {
type: String,
unique: true,
lowercase: true,
trim: true,
required: true
},
hash_password: {
type: String
},
created: {
type: Date,
default: Date.now
}
});
UserSchema.methods.comparePassword = function(password) {
return bcrypt.compareSync(password, this.hash_password);
};
mongoose.model('User', UserSchema);
Paso 4. Crear los controladores de usuarios
En la api/controladores carpeta, cree un archivo llamado usuario userController.js ejecutando touch api/controllers/userController.js
En el archivo userController, cree tres controladores diferentes para manejar usando el siguiente código
'use strict';
var mongoose = require('mongoose'),
jwt = require('jsonwebtoken'),
bcrypt = require('bcrypt'),
User = mongoose.model('User');
exports.register = function(req, res) {
var newUser = new User(req.body);
newUser.hash_password = bcrypt.hashSync(req.body.password, 10);
newUser.save(function(err, user) {
if (err) {
return res.status(400).send({
message: err
});
} else {
user.hash_password = undefined;
return res.json(user);
}
});
};
exports.sign_in = function(req, res) {
User.findOne({
email: req.body.email
}, function(err, user) {
if (err) throw err;
if (!user || !user.comparePassword(req.body.password)) {
return res.status(401).json({ message: 'Authentication failed. Invalid user or password.' });
}
return res.json({ token: jwt.sign({ email: user.email, fullName: user.fullName, _id: user._id }, 'RESTFULAPIs') });
});
};
exports.loginRequired = function(req, res, next) {
if (req.user) {
next();
} else {
return res.status(401).json({ message: 'Unauthorized user!!' });
}
};
exports.profile = function(req, res, next) {
if (req.user) {
res.send(req.user);
next();
}
else {
return res.status(401).json({ message: 'Invalid token' });
}
};
Nota: Se guardó una contraseña hash en la base de datos usando bcrypt.
Paso 6. En la api/ruta carpeta, cree un archivo llamado user userRoute.js y agregue el siguiente código:
'use strict';
module.exports = function(app) {
var userHandlers = require('../controllers/userController.js');
// todoList Routes
app.route('/tasks')
.post(userHandlers.loginRequired, userHandlers.profile);
app.route('/auth/register')
.post(userHandlers.register);
app.route('/auth/sign_in')
.post(userHandlers.sign_in);
};
Paso 7. Agregue el siguiente código en server.js
'use strict';
var express = require('express'),
app = express(),
port = process.env.PORT || 3000,
User = require('./api/models/userModel'),
bodyParser = require('body-parser'),
jsonwebtoken = require("jsonwebtoken");
const mongoose = require('mongoose');
const option = {
socketTimeoutMS: 30000,
keepAlive: true,
reconnectTries: 30000
};
const mongoURI = process.env.MONGODB_URI;
mongoose.connect('mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb', option).then(function(){
//connected successfully
}, function(err) {
//err handle
});
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(function(req, res, next) {
if (req.headers && req.headers.authorization && req.headers.authorization.split(' ')[0] === 'JWT') {
jsonwebtoken.verify(req.headers.authorization.split(' ')[1], 'RESTFULAPIs', function(err, decode) {
if (err) req.user = undefined;
req.user = decode;
next();
});
} else {
req.user = undefined;
next();
}
});
var routes = require('./api/routes/userRoutes');
routes(app);
app.use(function(req, res) {
res.status(404).send({ url: req.originalUrl + ' not found' })
});
app.listen(port);
console.log(' RESTful API server started on: ' + port);
module.exports = app;
Paso 9. Ahora solo necesita ejecutar el proyecto usando el siguiente comando e intentar iniciar sesión usando el JWT.
npm start
Paso 10. Abra Postman y cree una solicitud de publicación para localhost:3000/auth/register como sigue:
Paso 11. Después de esto, iniciemos sesión con esta URL localhost:3000/auth/sign_in . Introduzca las claves y los valores de correo electrónico y contraseña
Debajo del valor, agregue JWT y el token con un espacio entre ellos, así:
JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE
Paso 11. Luego, ingrese los parámetros para la clave y el valor para obtener el perfil. Desea crear como se muestra a continuación y enviar:
Como hemos visto, es bastante fácil construir un sistema de autenticación JWT con NodeJS. Puede encontrar el código completo utilizado en este tutorial aquí.
Nota:puede decodificar o verificar los detalles de su token JWT con esta herramienta