我在我的nestJS应用程序中(使用authGuard)使用了password-jwt身份验证策略,如何在控制器中访问令牌有效负载?

时间:2019-04-08 09:18:38

标签: node.js typescript jwt nestjs passport-jwt

我试图在受AuthGuard保护的路由中访问jwt有效负载。

我正在使用passport-jwt,令牌有效载荷是用户的电子邮件。

我可以通过运行下面的代码来实现:

import {
    Controller,
    Headers,
    Post,
    UseGuards,
} from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { AuthGuard } from '@nestjs/passport';

@Post()
@UseGuards(AuthGuard())
async create(@Headers() headers: any) {
    Logger.log(this.jwtService.decode(headers.authorization.split(' ')[1]));
}

我想知道是否还有更好的方法?

1 个答案:

答案 0 :(得分:5)

您的value[visited] = true;具有JwtStrategy方法。在这里,您可以访问validate。此方法的返回值将附加到请求(默认情况下,属性为JwtPayload下)。因此,您可以从有效负载中返回所需的任何内容:

user

然后通过注入请求在您的控制器中访问它:

async validate(payload: JwtPayload) {
  const user = await this.authService.validateUser(payload);
  if (!user) {
    throw new UnauthorizedException();
  }
  return {user, email: payload.email};
}

您可以通过创建自定义装饰器使此操作更加方便:

@Post()
@UseGuards(AuthGuard())
async create(@Req() request) {
    Logger.log(req.user.email);
}

然后注入import { createParamDecorator } from '@nestjs/common'; export const User = createParamDecorator((data, req) => { return req.user; }); 而不是@User