Я использую стратегию passport-jwt auth в своем приложении nestJS (с authGuard), как получить доступ к полезной нагрузке токена в моем контроллере? - PullRequest
4 голосов
/ 08 апреля 2019

Я пытаюсь получить доступ к полезной нагрузке jwt по маршруту, защищенному 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]));
}

Я хочу знать, есть ли лучший способ сделать это?

1 Ответ

5 голосов
/ 08 апреля 2019

Ваш 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 вместо @Req.

...