Desde la línea de comandos
express --view=ejs security
Dentro de la carpeta del proyecto, instale los módulos:
npm install --save sequelize mysql2 dotenv
sequelize init
Reconstruya los modelos con las credenciales de acceso y el esquema de la base de datos, con:
sequelize-auto -h 127.0.0.1 -d security -u root -x root -p 3306
config/config.json
, en el ambiente development, con los datos de conexión con el motor de bases de datos.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(16).toString('base64');
En la raíz del proyecto, cree el archivo .env
. Agregue las variables PORT y SALT. Asigne la secuencia de datos aleatorios a la variable SALT.
PORT=3002
SALT=...8uUYwT...
En el archivo app.js
, agregue el módulo dotenv
y cargue los datos de configuración.
var logger = require('morgan');
...
/* MÓDULO dotenv */
const dotenv = require('dotenv');
/* CARGA DE DATOS DE CONFIGURACION EN MEMORIA */
dotenv.config();
...
var indexRouter = ...
var app = express();
Agregue el módulo crypto, referencie los modelos autogenerados y el operador Op.
var express = require('express');
var router = express.Router();
/* Módulo crypto */
let crypto = require('crypto');
/* Referencia a los modelos */
const Users = require('../models').users;
const Roles = require('../models').roles;
const UsersRoles = require('../models').users_roles;
const { Op } = require("sequelize");
...
Agregue el controlador para el verbo HTTP POST
con la ruta /register
router.post('/register', async (req, res,next) => {
// Parámetros en el cuerpo del requerimiento
let { name, password, roleName } = req.body;
try {
// Encripte la contraseña con SALT
let salt = process.env.SALT
let hash = crypto.createHmac('sha512',salt).update(password).digest("base64");
let passwordHash = salt + "$" + hash
// Guarde los datos del usuario
let user = await Users.create({ name: name, password: passwordHash })
// Obtenga el rol en función del nombre
let role = await Roles.findOne({
where: {
[Op.and]: [
{name: roleName}
]
}
})
// Cree la relación usuario-rol
await UsersRoles.create({ users_iduser: user.iduser, roles_idrole: role.idrole })
// Redirige a la página de registros
res.redirect('/users')
} catch (error) {
res.status(400).send(error)
}
})
module.exports = router;
Descargue el archivo register.ejs y coloque el archivo dentro la carpeta views
Descargue y descomprima el archivo assets.zip. Mueva la carpeta assets
dentro la carpeta public
Modifique el controlador para el verbo HTTP GET
con la ruta /
router.get('/', async function(req, res, next) {
let users = await Users.findAll({ })
res.render('register', { title: 'User Registration', users: users });
});
Ejecute el servidor, con:
npm start
Compruebe el registro de los datos mediante el URL: http://localhost:3002/users
Versiona local y remotamente el repositorio security.
Como almacenar passwords en una BD para que estos no estén expuestos en el caso de un acceso a esta base:
— Fernando Romo (@El_Pop) August 18, 2022
el truco es reconstruir el password a partir de su hash y el salt previamente generado y almacenado. pic.twitter.com/sdESoBZOeg
vistas, encriptación