В NestJS есть ли способ передать данные от гвардии на контроллер? - PullRequest
0 голосов
/ 05 ноября 2019

Так что в настоящее время я широко использую NestJS в своей организации. И в целях аутентификации мы используем наших собственных охранников. Поэтому мой вопрос заключается в том, может ли кто-нибудь подсказать мне, если есть какой-либо способ передачи данных от охранника на контроллер, кроме response.locals expressjs? Это создает жесткую зависимость от фреймворка, и я не хочу этого сейчас.

TIA.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Вместо использования Guard вы можете создать свой собственный декоратор для получения данных:

export const Authorization = createParamDecorator((_, request: any) => {
  const { authorization: accessToken } = request.headers;
  try {
    const decoded = jwt.verify(accessToken, process.env.JWT_HASH);
    return pick(decoded, 'userId');
  } catch (ex) {
    throw new InvalidToken();
  }
});

export interface AuthUser {
  userId: string;
}

и передать его на ваш контроллер следующим образом:

  @Post()
  createFeedback(
    @Body() body: FeedbackBody,
    @Authorization() user: AuthUser,
  ): Promise<Feedback> {
    body.userId = user.userId;
    return this.feedbackService.feedback(body, user);
  }

Это может действовать какохранник, потому что когда ваш токен недействителен, он выдаст исключение

0 голосов
/ 05 ноября 2019

Единственный способ передать данные из Guard в контроллер - это либо прикрепить данные к полю по запросу, либо использовать какое-либо отражение метаданных, которое может стать более сложным, чем оно того стоит.

В вашей охране может быть функция canActivate, например

canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
  const req = context.switchToHttp().getRequest();
  if (/* some logic with req */) {
    req.myData = 'some custom value';
  }
  return true;
}

. А в вашем контроллере вы можете потянуть req.myData и вернуть строку some custom value.

...