6

我正在尝试访问受AuthGuard.

我正在使用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]));
}

我想知道是否有更好的方法来做到这一点?

4

1 回答 1

11

JwtStrategy有一个validate方法。在这里您可以访问JwtPayload. 此方法的返回值将附加到请求中(默认情况下在属性下user)。因此,您可以在此处从有效负载返回所需的任何内容:

async validate(payload: JwtPayload) {
  // You can fetch additional information if needed 
  const user = await this.userService.findUser(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而不是@Req.

于 2019-04-08T14:31:02.977 回答