我正在编写一个简单的get端点,并从前端报头发送令牌信息。但在后端我需要使用userId。我认为它是可用的令牌,但我如何从令牌获得userId ?
// React Front End service
const response = await fetch(
`${process.env.REACT_APP_API_HOST}/export-data/pdf?${urlParams}`,
{
headers: {
...authService.authHeader(),
Authorization: `Bearer ${authService.getToken()}`,
},
}
);
// Nestjs Back End controller
@UseGuards(AuthGuard)
@Permissions('admin')
@Get('/pdf')
async exportDataPdf(@Query() query: GetOrdersFilterDto): Promise<any> {
// I need to use userId from token here.
return await this.exportDataService.exportDataPdf(query);
}
这取决于您在签名用户/生成jwt令牌时如何签名this.jwtService.sign()
。
例如如果你使用
this.jwtService.sign({ userId: user._id });
然后你可以在你的控制器上做这个
@Get('profile')
getUserId(@Request() req: any) {
return req.user.userId;
}
注意req.user
对象被nestjs内部使用来存储jwt有效负载数据。
如果你想要任何你在jwt上提供的数据在一个nestjs保护。您也可以从req
对象中访问它。
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const [req] = context.getArgs();
// console log user ID
console.log(req.user.userId);
// create your conditional logic here before return true
return true;
}
您可以创建一个称为getUserIdFromToken
的方法并使用它。如果使用bcrypt
从电子邮件中创建令牌,则可以从中获得电子邮件。下面是我在node:
- 编码令牌
const hashData = { email: user.email }
const accessToken = jwt.sign(hashData, process.env.ACCESS_TOKEN_SECRET)
- 解码令牌
const email = jwtDecode(token).email;
然后,您可以检索用户与电子邮件。