0

我正在编写一个简单的 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);
    }
4

2 回答 2

0

您可以调用一个方法getUserIdFromToken并将其用于此目的。如果bcrypt用于从电子邮件中创建令牌,您可以从中取回电子邮件。这是我在节点中的做法:

  • 对令牌进行编码
const hashData = { email: user.email }
const accessToken = jwt.sign(hashData, process.env.ACCESS_TOKEN_SECRET)
  • 解码令牌
const email = jwtDecode(token).email;

然后,您可以使用电子邮件检索用户。

于 2021-08-04T22:26:29.603 回答
0

这取决于您在登录this.jwtService.sign()用户/生成 jwt 令牌时如何签名。

例如,如果您使用

this.jwtService.sign({ userId: user._id });

然后你可以简单地在你的控制器上做到这一点

@Get('profile')
  getUserId(@Request() req: any) {
    return req.user.userId;
  }

Nestjs 在内部使用Notereq.user对象来存储 jwt 有效负载数据。

如果您想要在 nestjs 守卫中的 jwt 上提供任何数据。您还可以从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;
}
于 2022-02-19T15:26:19.340 回答