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
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.