Yo diria que es un 403, no tiene permisos de acceso. 401 yo lo uso solo para si es sesion o no.
Introducci贸n
C贸mo autenticar usuarios con Node.js
Autenticaci贸n vs. autorizaci贸n
Tienda en l铆nea: instalaci贸n del proyecto
Protecci贸n de contrase帽as
Middleware de verificaci贸n
Hashing de contrase帽as con bcryptjs
Implementando hashing para usuarios
Passport y JSON Web Tokens
Implemetando login con Passport.js
驴Qu茅 es un JWT?
Firmar y verificar tokens
Generar JWT en el servicio
Protecci贸n de rutas
Control de roles
Obteniendo 贸rdenes del perfil
Manejo de la autenticaci贸n desde el cliente
Env铆o de emails con Node.js
C贸mo enviar emails con Node.js
Implementando el env铆o de emails
Recuperaci贸n de contrase帽as
Generando links de recuperaci贸n
Validando tokens para cambio de contrase帽a
Despliegue a producci贸n
Deploy en Heroku
Pr贸ximos pasos
C贸mo seguir aprendiendo backend con Node.js
A煤n no tienes acceso a esta clase
Crea una cuenta y contin煤a viendo este curso
Aportes 4
Preguntas 0
Yo diria que es un 403, no tiene permisos de acceso. 401 yo lo uso solo para si es sesion o no.
To create a role control, a middleware will be our best friend
First of all, let鈥檚 think about what we need, we need a middleware able to check what kind of users is authenticated, for this, let鈥檚 create a single function, which will receive a list of roles and return a middleware.
//@param roles array of roles that can access the route
function checkRole(roles) {
return (req, res, next) => {
const user = req.user;
//Check if rol is allowed to access
if (!roles.includes(user.role)) {
next(boom.unauthorized("Unauthorized!You cannot do this, Admins have been notified "));
} else {
//If everything is right, go to next middleware
next();
}
}
}
Finally just use it wherever you need to check role, por example:
router.post("/",
passport.authenticate('jwt', { session: false }),
checkRole(['admin', 'Captain']),
validatorHandler(getOrderSchema, "body"),
async(req, res, next) => {
try {
const body = req.body;
res.status(201).json(await service.create(body));
} catch (error) {
next(error);
}
}
);
Recommendation
Si estan usando insomia para hacer la pruebas de la API, pueden guardar el token del usuario al hacer login. Pega la siguiente linea, dentro del archivo de variables de entorno
{
"TOKEN_ADMIN": "{% response 'body', 'req_1e7f7e044bd5407bbff202ad27392f6e', 'b64::JC50b2tlbg==::46b', no-history, 60 %}",
}
Nota: despu茅s de pegar la l铆nea de c贸digo aparecer谩 un recuadro en rojo, no se asusten, deben configurar los par谩metros seg煤n sus request disponible (esto se hace a traves de una ventana gr谩fica)
Se debe trabajar en la gesti贸n de permisos y roles ya que no todos deben poder crear categor铆as o crear usuarios, 煤nicamente un usuario administrador podr铆a hacer eso.
Se crea un middleware que verifique que tipo de rol es, y lo que lo deje seguir o no.
En auth.handler.js
se crea la funci贸n checkAdminRole
la cual verificar谩 si el rol del usuario es admin o customer, si es admin entonces pasa al siguiente middleware, de lo contrario lanza un error unauthorized.
function checkAdminRole(req, res, next) {
const user = req.user;
if (user.role === 'admin') {
next();
} else {
next(boom.unauthorized());
}
}
A la ruta se le agrega el middleware, la l贸gica es:
Autenticar, verificar el token y obtener los datos del user (*passport.authenticate
)*.
Verificar el tipo de rol de user (checkAdminRole
).
Validar los datos del body (validatorHandler
).
Conectarse al servicio.
router.post(
'/',
passport.authenticate('jwt', { session: false }),
checkAdminRole,
validatorHandler(createCategorySchema, 'body'),
async (req, res, next) => {
try {
const body = req.body;
const newCategory = await service.create(body);
res.status(201).json(newCategory);
} catch (error) {
next(error);
}
}
);
Cuando se desea escalar y tener m谩s roles, la funci贸n checkAdminRole
se vuelve poco mantenible, por ello creamos la funci贸n checkRoles
que recibir谩 los roles que tendr谩n acceso a ese endpoint. Si en los roles se encuentra el rol del usuario, devolver谩 true
y tendr谩 acceso al endpoint, de lo contrario devolver谩 false y arrojar谩 error unauthorized.
En resumen, la funci贸n checkRoles
recibe un array de roles, verifica que user.role
se encuentre en ese array, y si todo bien procede al siguiente middleware.
function checkRoles(...roles) {
return (req, res, next) => {
const user = req.user;
if (roles.includes(user.role)) {
next();
} else {
next(boom.unauthorized());
}
};
}
Haciendo la implementaci贸n del middleware en la ruta queda de la siguiente manera, agregando los roles a los que tendr谩 acceso ese endpoint.
router.post(
'/',
passport.authenticate('jwt', { session: false }),
checkRoles('admin', 'seller'),
validatorHandler(createCategorySchema, 'body'),
async (req, res, next) => {
try {
const body = req.body;
const newCategory = await service.create(body);
res.status(201).json(newCategory);
} catch (error) {
next(error);
}
}
);
Se recomienda utilizar la librer铆a accesscontrol donde realmente y de forma explicita se gestionan permisos de una forma m谩s profunda y avanzada.
驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.