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:

4D
2H
55M
26S

Generar JWT en el servicio

10/20
Recursos

Aportes 12

Preguntas 1

Ordenar por:

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

o inicia sesi贸n.

Generating tokes from backend

  • First of all, configure .env to provide a secret and it won鈥檛 be accessible from code.

    jwtSecret="A SECRET REALLY SECRET"

    Page to generate greats passwords:

  • In our auth.routes configure secret such as we did in the last lesson

    router.post('/login',
        //We are using the local strategy and not using sessions
        passport.authenticate('local', { session: false }),
        async(req, res, next) => {
            try {
                const user = req.user;
                **const payload = {
                    sub: user.id,
                    role: user.role
                }**
    
                **const token = jwt.sign(payload, config.auth.jwtSecret);**
    
                res.json({ user, token });
    
            } catch (err) {
                next(err);
            }
        }
    );
    
  • Finally, try it in insomnia/postman!

Al implementar JWT ya no es necesario enviar los datos del usuario en la petici贸n, ya que por medio del payload del token podemos enviarla, ademas recordar que por ning煤n motivo se debe enviar informacion sensible del usuario.

Si keygen. io no esta disponible se podria utilizar:
allkeysgenerator. com

En el archivo auth.route.js se hace la implementaci贸n del JWT, primero se hace la autenticaci贸n con la estrategia local y con ello se tiene al usuario (req.user), por lo tanto, se crea el payload con los datos del usuario, posteriormente se firma el token con la funci贸n .sign() y como respuesta se env铆a un JSON con el user y el token.

const express = require('express');
const passport = require('passport');
const jwt = require('jsonwebtoken');

const { config } = require('../../config/config');

const router = express.Router();

router.post(
  '/login',
  passport.authenticate('local', { session: false }),
  async (req, res, next) => {
    try {
      const user = req.user;
      const payload = {
        sub: user.id,
        role: user.role,
      };

      const token = jwt.sign(payload, config.jwtSecret);
      res.json({ user, token });
    } catch (error) {
      next(error);
    }
  }
);

module.exports = router;

El secret es necesario para firmar el token, por ello se asigna en el archivo .env, una p谩gina para generar passwords con diferentes algoritmos es https://keygen.io/.

PORT=3000
DATABASE_URL='postgres://john:[email protected]:5432/my_store'
API_KEY=321456
JWT_SECRET='D8T1LkIMVTA8yYSuNgbadlFJ9yGU7cjD'

La nueva variable de entorno se agrega a la configuraci贸n config/config.js:

require('dotenv').config();

const config = {
  env: process.env.NODE_ENV || 'dev',
  isProd: process.env.NODE_ENV === 'production',
  port: process.env.PORT || 3000,
  dbUser: process.env.DB_USER,
  dbPassword: process.env.DB_PASSWORD,
  dbHost: process.env.DB_HOST,
  dbName: process.env.DB_NAME,
  dbPort: process.env.DB_PORT,
  dbUrl: process.env.DATABASE_URL,
  apiKey: process.env.API_KEY,
  jwtSecret: process.env.JWT_SECRET,
};

module.exports = { config };

#hola

Hola

jaja el profe dandose cuenta que no sigue sus propios consejos jajaja

Otra cosa que es recomendable agregarle al token es un tiempo de expiraci贸n (tambi茅n definido desde envs o alguna configuraci贸n por usuario/cliente)

const token = jwt.sign(payload, "secret", {
  // Ejemplo: token expira en 10 horas
  expiresIn: "10h" 
})

隆Excelente clase! 馃専

馃棟 Clase #10: Generar JWT en el servicio 10/20 馃棟

Pasos: 馃摑

  • Vamos a implementar la l贸gica para que cuando se haga login, tengamos el token. Para ello en VSC, en la carpeta routes, abrimos el archivo auth.router.js, el c贸digo queda:
const express = require('express');
const passport = require('passport');
const jwt = require('jsonwebtoken');

//Traemos el config para el jwtSecret
const { config } = require('./../config/config');

const router = express.Router();

router.post('/login',
  passport.authenticate('local', {session: false}),
  //Al pasar la capa de autenticaci贸n despu茅s de verificar que el usuario y password son correctos
  //al devolver el login, se le brinda un token
  async (req, res, next) => {
    try {
      const user = req.user;
      const payload = {
        sub: user.id,
        role: user.role
      }
      //Se hace la firma
      const token = jwt.sign(payload, config.jwtSecret);
      res.json({
        user,
        token
      });
    } catch (error) {
      next(error);
    }
  }
);

module.exports = router;


Guardamos, vamos a la carpeta config y abrimos el archivo config.js y despu茅s de apiKey colocamos:

jwtSecret: process.env.JWT_SECRET,


Guardamos, abrimos la p谩gina para generar claves (enlace: aqu铆), para 茅sta clase se busc贸: WEP 256-bit Key, se gener贸 en la pesta帽a NEW y luego al dar en la pesta帽a COPY, aparece un cuadro donde indica que al presionar las teclas Ctrl + C se copia la clave generada.

Esa clave se copia y se pega en el archivo de variables de entorno .env despu茅s de API_KEY se coloca el JWT_SECRET, para mi ejemplo:

JWT_SECRET=csvV9KYB4QeqhaEgoJdIzwunROb1XDZU


Guardamos, como se modific贸 el archivo .env con las variables de entorno, en la terminal se corre de nuevo:

npm run dev


Vamos a Insomia y en la carpeta de Auth en Login, la solicitud del POST con la direcci贸n: _.API_URL/api/v1/auth/login


En el body JSON:

{
	"email": "[email protected]",
	"password": "12356 .2020",
	"role": "admin"
}


Al enviar la petici贸n debe salir el c贸digo 200 OK:

{
	"user": {
		"id": 3,
		"email": "[email protected]",
		"role": "admin",
		"createdAt": "2023-03-17T02:47:32.524Z"
	},
	"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjMsInJvbGUiOiJhZG1pbiIsImlhdCI6MTY3OTUzNjc4MH0.ivIhrTTJreKyEFvFWJbRBJ_eLEItoIgH5HlWSVLOESw"
}

Otra forma de generar secrets desde la terminal es:

$ openssl rand -hex 45

Otra opcion para generar los secrets es directamente con el mismo node creando caracteres aleatorios, en este caso lo hago con un oneliner desde la terminal

echo 'key=require("crypto").randomBytes(128).toString("base64");console.log(key)' | node