Desde la línea de comandos
Dentro de la carpeta del proyecto, instale los módulos:
npm install --save jsonwebtoken swagger-autogen swagger-ui-express
Desde la línea de comandos
Acceda a la interfaz de nodeJS, con:
node
Genere y copie la secuencia de datos aleatorios, con:
> let crypto = require('crypto');
> crypto.randomBytes(64).toString('hex');
En la raíz del proyecto, modifique el archivo .env
. Agregue la variable TOKEN_SECRET. Asigne la secuencia de datos aleatorios a la variable TOKEN_SECRET.
PORT=3002
SALT=...8uUYwT...
TOKEN_SECRET=...26e402586e2faa8da4c98a35f1b20d6b033c60...
Agregue el módulo jsonwebtoken.
var express = require('express');
var router = express.Router();
/* Módulo jsonwebtoken */
const jwt = require('jsonwebtoken');
/* Módulo crypto */
let crypto = require('crypto');
...
Agregue el controlador para el verbo HTTP POST
con la ruta /generateToken
...
router.post('/generateToken', async (req, res,next) => {
// Parámetros en el cuerpo del requerimiento
let { name, password } = req.body;
try {
// Encripte la contraseña
let salt = process.env.SALT
let hash = crypto.createHmac('sha512', salt).update(password).digest("base64");
let passwordHash = salt + "$" + hash
/* Obtenga el usuario y su rol */
let user = await Users.findOne({ where: { [Op.and]: [ { name: name }, { password: passwordHash } ] } })
let relations = await UsersRoles.findOne({ where: { [Op.and]: [ { users_iduser: user.iduser } ] } });
let roles = await Roles.findOne({ where: { [Op.and]: [ { idrole: relations.roles_idrole } ] } });
/* Genera el token con los datos encriptados */
const accessToken = jwt.sign({ name: user.name, role: roles.name }, process.env.TOKEN_SECRET);
res.json({ accessToken });
} catch (error) {
res.status(400).send(error)
}
});
module.exports = router;
En la raíz del proyecto, cree el archivo swagger.js. En la variable endpointsFiles coloque las rutas a los controladores de los modelos.
const swaggerAutogen = require('swagger-autogen')()
const outputFile = './swagger_output.json'
const endpointsFiles = ['./routes/users.js']
swaggerAutogen(outputFile, endpointsFiles)
Modifique el archivo package.json y agregue la entrada swagger-autogen.
...
"scripts": {
...
"swagger-autogen": "node swagger.js"
...
},
...
Desde la línea de comandos, ejecute el comando:
npm run swagger-autogen
En el archivo swagger_ouput.json, modifique el puerto (3002) y las URLs de cada endpoint (clave paths) de acuerdo con las rutas en la aplicación:
"host": "localhost:3002",
...
"paths": {
"/users": {
...
},
"/users/register": {
...
},
"/users/generateToken": {
...
}
}
...
Modifique el archivo generado app.js con la referencia al módulo swagger-ui-express y al archivo generado swagger_output.json. Además, agregue la ruta a la documentación.
...
/* REFERENCIA AL MÓDULO */
const swaggerUi = require('swagger-ui-express')
/* REFERENCIA AL ARCHIVO GENERADO */
const swaggerFile = require('./swagger_output.json')
...
const app = express();
...
app.use('/users', usersRouter);
/* CONFIGURACIÓN DE LA RUTA A LA DOCUMENTACIÓN */
app.use('/documentation', swaggerUi.serve, swaggerUi.setup(swaggerFile))
...
Ejecute el servidor, con:
npm start
Compruebe el endpoint para generar el token http://localhost:3002/documentation/#/default/post_users_generateToken a partir de las credenciales de acceso.
Versiona local y remotamente el repositorio security.
What's the most scalable solution to authentication?
— Saurabh Dashora (@ProgressiveCod2) December 13, 2023
JSON Web Tokens or JWT.
A single JWT can contain all the required information about an entity, making it an ideal candidate for authentication.
There are 3 main components of a JWT.
Here's the structure of JWT:
[1] Header… pic.twitter.com/gwbX8UJU7l
middleware, autenticación, autorización, JSON Web Tokens