No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Aprende todo un fin de semana sin pagar una suscripci贸n 馃敟

Aprende todo un fin de semana sin pagar una suscripci贸n 馃敟

Reg铆strate

Comienza en:

2D
3H
53M
31S

Protecci贸n de rutas

11/20
Recursos

Aportes 11

Preguntas 5

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

wow! excelentes cursos de Nicol谩s Molina toda la parte de node con Express y base de datos con postgres y todas las librer铆as para autentificaci贸n , seguridad de lo mejor felicidades , ahora ya puedo utilizar node en mi trabajo. :)

Encontr茅 una forma para proteger todas las rutas de /categories sin agregar el middleware en cada uno de los m茅todos.

router.use('/categories', passport.authenticate('jwt', { session: false }), categoriesRouter);

Para proteger las rutas se instala la estrategia passport-jwt, esta estrategia va a capturar el token que viene del header, si el token est谩 firmado con nuestra firma entonces lo va a autorizar, de otro modo no tendr谩 acceso a la ruta.
Comando de instalaci贸n: npm install passport-jwt.


Se crea la nueva estrategia jwt.strategy.js:

Se requiere la Strategy y ExtractJwt (d贸nde el token est谩 para que extraiga el token).

Se crean las options, estas contienen:

  • jwtFromRequest 鈫 Indica de d贸nde se saca el token, en este caso del header como bearer token
  • secretOrKey 鈫 Cu谩l es el secreto, necesario para poder verificar si la firma es v谩lida o no.

La nueva estrategia (JwtStrategy) recibe las options y una funci贸n callback que recibe el payload del JWT y la funci贸n done que retorna el payload que ya verific贸.

const { Strategy, ExtractJwt } = require('passport-jwt');
const { config } = require('../../../config/config');

const options = {
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  secretOrKey: config.jwtSecret,
};

const JwtStrategy = new Strategy(options, (payload, done) => {
  return done(null, payload);
});

module.exports = JwtStrategy;

La nueva estrategia se agrega a utils/auth/index.js:

const passport = require('passport');

const LocalStrategy = require('./strategies/local.strategy');
const JwtStrategy = require('./strategies/jwt.strategy');

passport.use(LocalStrategy);
passport.use(JwtStrategy);

Implementando la nueva estrategia a la ruta para crear categor铆as ser谩 como decir 鈥渓os clientes que tengan un JWT v谩lido van a poder crear categor铆as鈥.

Se requiere passport, despu茅s se utiliza el m茅todo authenticate que recibe el nombre de la estrategia jwt sin un manejo de sesi贸n (session: false).

categories.router.js:

const passport = require('passport');

router.post(
  '/',
  passport.authenticate('jwt', { session: false }),
  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);
    }
  }
);

En resumen, primero se identifica al usuario (passport.authenticate), despu茅s se validan los datos (validatorHandler) y si todo bien, se conecta a la capa de servicios para poder crear la categor铆a.

En Insomnia se env铆a el token a trav茅s de los headers o usando la opci贸n Bearer de la pesta帽a Auth.

En Insomnia, al igual que postman, se puede a帽dir una variable al entorno para no tener que estar metiendo el token a cada ruta.

  • Seleccionar la opci贸n Manage Enviroments
  • A帽adir una nueva variable con el valor access_control, pulsar control + espacio para que salga un men煤 contextual asociado al valor de esa variable, y escribir el texto response
  • Pulsar en el texto que se genera como resultado. Esto abrir谩 un popup donde se puede seleccionar en Requestla ruta del login y el filter a帽adir $.token. En el preview nos deber铆a aparecer el token
  • Luego hay que ir a cada ruta y en la pesta帽a Auth, escoger Bearer y en el campo de introducci贸n de Token a帽adir la vairable (control + barra espaciadora) y _access_token

Un peque帽o aporte para proteger rutas agrupadas por el recurso, sirve para ahorrar un poco de trabajo al no tener que ir al archivo de las rutas para proteger una por una.

const express = require('express');
const passport = require('passport');
const { checkRoles } = require('./../middlewares/auth.handler');

const usersRouter = require('./users.router');
const profilesRouter = require('./profiles.router');
const coursesRouter = require('./courses.router');
const skillsRouter = require('./skills.router');
const authRouter = require('./auth.router');

function routerApi(app) {
  const router = express.Router();
  app.use('/api/v1', router);
  
  router.use(
    '/users', 
    passport.authenticate('jwt', {session: false}),
    checkRoles('admin'),
    usersRouter
  );
  
  router.use(
    '/profiles', 
    passport.authenticate('jwt', {session: false}),
    profilesRouter
  );
  
  router.use('/courses', coursesRouter);
  router.use('/skills', skillsRouter);
  router.use('/auth', authRouter);
}

module.exports = routerApi;

BEARER[portador] AUTHENTICATION o autenticaci贸n de portador (tambi茅n llamada autenticaci贸n de token) es un esquema de autenticaci贸n HTTP que implica tokens de seguridad llamados tokens de portador. El nombre 鈥渁utenticaci贸n de portador鈥 puede entenderse como 鈥渄ar acceso al portador de este token鈥.

En Postman pueden agregar una autorizacion a todos los request de un folder. Pueden combinar con una variable para facilitar el testing de sus endpoints

Guarde el

passport.authenticate('jwt', {session: false})

En una const para simplificar todo un poco y las fui agregando para proteger las demas routers

馃攼 Clase #11: Protecci贸n de rutas 11/20 馃攼

Cuando hacemos el login, el backend nos env铆a un token, ese token podemos usarlo para poder navegar diversas rutas, de modo que el backend nos solicita el token generado al hacer el login para acceder a la ruta protegida.

Pasos: 馃摑


- Vamos a la p谩gina de passport, en passport-jwt indica que se debe instalar el paquete en la terminal:

npm install passport-jwt


Cuando haya instalado bien al arrojar:

found 0 vulnerabilities

  • Vamos a VSC, dentro de la ruta utils/auth/strategies se crea el archivo jwt.strategy.js, el c贸digo queda:
//Llamar la librer铆a passport-jwt
const { Strategy, ExtractJwt } = require('passport-jwt');
//Necesitamos a config para el secreto
const { config } = require('../../../config/config');

const options = {
  //De d贸nde va a sacar el token:
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  //Secreto para ver si la firma es v谩lida o no:
  secretOrKey: config.jwtSecret
}

//Estrategia:
const JwtStrategy = new Strategy(options, (payload, done) => {
  //Retorna cuando todo est谩 bien y devuelve el payload que verific贸:
  return done(null, payload);
});

module.exports = JwtStrategy;


Guardamos, abrimos el archivo index.js de la ruta utils/auth, agregamos la nueva estrategia creada de jwt, el c贸digo queda:

const passport = require('passport');
//Aqui se definen qu茅 estrategias se van a usar
const LocalStrategy = require('./strategies/local.strategy');
const JwtStrategy = require('./strategies/jwt.strategy');

passport.use(LocalStrategy);
passport.use(JwtStrategy);


Guardamos, vamos a la carpeta categories y abrimos el archivo categories.routes.js, agregamos en la librer铆a (en la cabecera) a passport:

const passport = require('passport');


Luego agregamos en la petici贸n del POST la autenticaci贸n del jwt, el c贸digo queda:

router.post('/',
  //Proteger este endpoint con passport
  passport.authenticate('jwt', {session: false}),
  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);
    }
  }
);


Guardamos, si en la terminal no se ha compilado, ejecutar: npm run dev cuando salga Mi port 3000, podemos abrir Insomnia, vamos a la carpeta de Auth, en la petici贸n del POST (login) y como tenemos en la salida el token, lo copiamos, vamos a la carpeta de Categories, luego a Create Category con la petici贸n POST y la direcci贸n:

_. API_URL/api/v1/categories con la opci贸n de desarrollador (dev), si no enviamos el token, en la salida tenemos un c贸digo 401 Unauthorized (que no estamos autorizados para acceder).

Como ya tenemos el token, hay una pesta帽a que dice 鈥淎uth鈥, le damos click y en la lista desplegable elegimos a 鈥淏earer鈥 y en la casilla donde sale TOKEN pegamos el token que copiamos de Auth cuando hicimos login, en el JSON en el body tenemos:

{
	"name": "new category",
	"image": "direcci贸n p谩gina"
}


Al dar Send, obtenemos un c贸digo 201 Created:

{
	"createdAt": "2023-03-27T20:40:12.397Z",
	"id": 3,
	"name": "new category",
	"image": "direcci贸n p谩gina"
}


Si seleccionamos la pesta帽a 鈥淭imeline鈥 aparece el tipo de 鈥淎uthorization鈥 que en nuestro caso es de tipo 鈥淏earer鈥:


Otra forma de enviar el token es que en 鈥淗eader鈥 antes de enviar la petici贸n POST se coloque en la primera casilla: Authorization y en la segunda casilla: Bearer seguido del token:


creacion de mi estrategia en el archivo archivo jwt.strategy.js

El v铆deo tiene un error con el audio en el minuto 6.