Настройте ответ при сбое проверки для jwt Strategy NestJs - PullRequest
0 голосов
/ 03 февраля 2020

Я успешно реализовал стратегию jwt для аутентификации с использованием гнезда Js.

Ниже приведен код для стратегии jwt

import { ServerResponse } from './../helpers/serverResponse.helper';
import { Injectable, UnauthorizedException, HttpStatus } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { config as env } from 'dotenv';
import { Bugsnag } from '../helpers/bugsnag.helper';

env();

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
  constructor(
    private readonly logger: Bugsnag,
    ) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: process.env.JWT_SECRET_KEY,
      passReqToCallback: true,
    });

  }

  async validate(payload, done: Function) {
    try {
      const validClaims = await this.authService.verifyTokenClaims(payload);

      if (!validClaims)
          return done(new UnauthorizedException('invalid token claims'), false);
      done(null, payload);
    } catch (err) {
      this.logger.notify(err);
      return ServerResponse.throwError({
        success: false,
        status: HttpStatus.INTERNAL_SERVER_ERROR,
        message: 'JwtStrategy class, validate function',
        errors: [err],
      });
    }
  }
}

Я видел здесь , что функция validate будет вызываться только тогда, когда в заголовках запроса был указан действительный токен, и я согласен с этим. Однако я хотел бы знать, возможно ли настроить объект ответа, который отправляется в этом случае ( предоставлен неверный токен ).

Если да, как мне это сделать?

1 Ответ

0 голосов
/ 04 февраля 2020

Вы можете использовать фильтр исключений , чтобы поймать UnauthorizedException s и изменить ответ там, если хотите. Другим вариантом было бы расширение класса AuthGuard('jwt') mixin и добавление в некоторые логики c вокруг try/catch для super.canActivate(context), затем в ошибке прочитайте, в чем причина, и добавьте спецификацию c UnauthorizedException с вашим заказным сообщением

...