Saltar al contenido

Uso de la firma ‘nestjs/jwt’ con secreto dinámico/relacionado con el usuario

Hola, tenemos la respuesta a lo que andabas buscando, deslízate y la hallarás más abajo.

Solución:

Esto aún no es posible únicamente con Nest’s JwtModule pero usted mismo puede implementar fácilmente las partes que faltan.

Demo en vivo

Editar secretos de Nest Dynamic JWT

Puede crear tokens llamando a las siguientes rutas:

usuario1 (secreto: ‘123’): https://yw7wz99zv1.sse.codesandbox.io/login/1

usuario2 (secreto: ‘456’): https://yw7wz99zv1.sse.codesandbox.io/login/2

Luego llame a la ruta protegida '/' con tu token y recibe tu usuario:

curl -X GET https://yw7wz99zv1.sse.codesandbox.io/ 
      -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxIiwiaWF0IjoxNTUzNjQwMjc5fQ.E5o3djesqWVHNGe-Hi3KODp0aTiQU9X_H3Murht1R5U'

¿Como funciona?

En el AuthService Solo estoy usando el estándar. jsonwebtoken biblioteca para crear el token. A continuación, puede llamar createToken desde su ruta de inicio de sesión:

import * as jwt from 'jsonwebtoken';

export class AuthService 
  constructor(private readonly userService: UserService) 

  createToken(userId: string) 
    const user = this.userService.getUser(userId);
    return jwt.sign( userId: user.userId , user.secret,  expiresIn: 3600 );
  

  // ...

En el JwtStrategy tu usas secretOrKeyProvider en vez de secretOrKey que puede acceder de forma asíncrona a la UserService para obtener el secreto de usuario dinámicamente:

export class JwtStrategy extends PassportStrategy(Strategy) 
  constructor(
    private readonly authService: AuthService,
    private readonly userService: UserService,
  ) 
    super(
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKeyProvider: (request, jwtToken, done) => 
        const decodedToken: any = jwt.decode(jwtToken);
        const user = this.userService.getUser(decodedToken.userId);
        done(null, user.secret);
      ,
    );
  

  // ...

Tenga en cuenta que las opciones que pasa al JwtModule me gusta expiresIn no se utilizará, sino que pase directamente sus opciones en el AuthService. Importar el JwtModule sin opciones:

JwtModule.register()

General

¿Mi forma de manejar el secreto de usuario tiene sentido aquí?

Esto es difícil de responder sin conocer sus requisitos exactos. Supongo que hay casos de uso para jwt con secretos dinámicos, pero con eso estás perdiendo una gran propiedad de jwt: no tienen estado. Esto significa que su AuthService puede emitir un token jwt y algunos ProductService que requiere autenticación puede simplemente confiar en el jwt (conoce el secreto) sin hacer ninguna llamada a otros servicios (es decir, UserService que tiene que consultar la base de datos).

Si está relacionado con el usuario keys no son un requisito difícil considere rotar el keys con frecuencia en su lugar haciendo uso de jwt kid propiedad.

La opción de agregar secret en JwtSignOptions se ha agregado en nestjs/jwt versión 7.1.0.

Con eso, el ejemplo sería:

public async createToken(email: string): Promise 
    const expiresIn = 60 * 60 * 24;
    const user = await this.userService.user( where:  email  );
    const accessToken = await this.jwtService.signAsync(
         email: user.email ,
         expiresIn,
          secret: user.secret,
        

    return 
      accessToken,
      expiresIn,
    ;
 


Sección de Reseñas y Valoraciones

Si estás contento con lo expuesto, tienes la libertad de dejar una reseña acerca de qué te ha gustado de esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *