jsonwebtoken : Una implementación de JSON Web Tokens.
express-jwt : Este módulo le permite autenticar solicitudes HTTP utilizando tokens JWT en sus aplicaciones Node.js. Los JWT se utilizan normalmente para proteger los puntos finales de la API.
composable-middleware: Este permite que se utilicen una serie de funciones de middleware como si fueran una única función de middleware.
Luego de esto crearemos un archivo auth/auth.service.js
auth/auth.service.js
/** * Auth Middleware */constjwt=require('jsonwebtoken');constexpressJwt=require('express-jwt');constcompose=require('composable-middleware');constUser=require('../api/user/user.model');constconfig= { secrets: { session:'w0rksh0p-full5tack-j4v45cr1pt', }, userRoles: ['admin','manager','user'],};constvalidateJwt=expressJwt({ secret:config.secrets.session,});/** * Attaches the user object to the request if authenticated * Otherwise returns 403 */functionisAuthenticated() {returncompose()// Validate jwt.use((req, res, next) => {// allow access_token to be passed through query parameter as wellif (req.query &&req.query.hasOwnProperty('access_token')) {req.headers.authorization =`Bearer ${req.query.access_token}`; }// IE11 forgets to set Authorization header sometimes. Pull from cookie instead.if (req.query &&typeofreq.headers.authorization ==='undefined'&&req.cookies) {const { token } =req.cookies;req.headers.authorization =`Bearer ${token}`; }validateJwt(req, res, next); })// Attach user to request.use((req, res, next) => {User.findById(req.user._id).exec().then((user) => {if (!user) {returnres.status(401).end(); }req.user = user;next();returnnull; }).catch(err =>next(err)); });}/*** Checks if the user role meets the minimum requirements of the route*/functionhasRole(roleRequired) {if (!roleRequired) {thrownewError('Required role needs to be set'); }returncompose().use(isAuthenticated()).use((req, res, next) => {if (config.userRoles.indexOf(req.user.role) >=config.userRoles.indexOf(roleRequired)) {returnnext(); }returnres.status(403).send('Forbidden'); });}/*** Returns a jwt token signed by the app secret*/functionsignToken(id, role) {returnjwt.sign({ _id: id, role },config.secrets.session, { expiresIn:60*60*5, });}module.exports= { isAuthenticated, hasRole, signToken,};
Básicamente este archivo tendrá las funciones/middleware de cómo saber si un usuario esta logueado, si el rol del usuario que esta solicitando un recurso puede acceder a el, la codificación y decodificación del token.
Finalmente vamos a crear el archivo index.js que será el encargado de tener todas las diferentes estrategias de autenticación de nuestra plataforma, como Facebook, Google entre otras. Este archivo en sí tendrá finalmente rutas de express con la lógica necesaria para la autenticación.
En el siguiente punto vamos a configurar Passport.js para usarlo dentro de Express.js y como agregar alguno de los middlewares que creamos acá a un endpoint.