Cree el controlador para el verbo HTTP POST
con la ruta /postToken
...
router.post('/postToken', 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);
/* Tiempo de expiración de la cookie: 30 segundos */
const options = {
expires: new Date(
Date.now() + 30 * 1000
)
}
/* Crea la cookie "jwt-token" con el accessToken */
res.cookie("jwt-token", accessToken, options)
/* Redirección al controlador para el verbo HTTP GET con la ruta /getToken */
res.redirect('/users/getToken')
} catch (error) {
/* En caso de error, elimina la cookie */
res.clearCookie('jwt-token')
/* Tiempo de expiración de la cookie: 10 segundos */
const options = {
expires: new Date(
Date.now() + 10 * 1000
)
}
res.cookie("error", "No token generated", options)
/* Redirige a la página original */
res.redirect('/users/getToken')
}
});
module.exports = router;
Descargue el archivo gettoken.ejs y coloque el archivo dentro la carpeta views
Modifique el controlador para el verbo HTTP GET
con la ruta /getToken
...
router.get('/getToken', function (req, res, next) {
/* Lee las cookies "jwt-token" y "error" */
let token = req.cookies['jwt-token']
let error = req.cookies['error']
/* Renderiza el contenido de las cookies en la vista */
res.render('gettoken', { title: 'User Login', token: token, error: error });
});
router.post('/postToken', async (req, res,next) => {
...
});
...
Ejecute el servidor, con:
npm start
Compruebe el endpoint para generar el token http://localhost:3002/users/getToken a partir de las credenciales de acceso.
Versiona local y remotamente el repositorio security.
Day 13
— Ruhan Khandakar (@KhandakarRuhan) November 14, 2019
✔️ Implement #jsonWebToken and sent with #cookies #CodingPhase #365CodingPhase #365codingphasechallenge #100DaysOfCode #mvc #expressjs #nodejs #jwt pic.twitter.com/IZ3jGY5zzJ
cookies