Почему в приложении nest js payload.sub не определено в методе проверки JwtStrategy? - PullRequest
0 голосов
/ 15 марта 2020

Я работаю над приложением nestjs и использую JwtStrategy для аутентификации.

Я генерирую access token, напевая некоторую информацию, включая payload.sub:

token.service.ts

async createAccessToken(
    payload: IJwtPayload,
    expires = this.expiresInDefault,
  ): Promise<LoginResponseVm> {

    ... other codes ....

    // sign
    // here payload is contain sub property and is filled by userId
    const signedPayload = sign(payload, this.jwtKey, options);
    const token: LoginResponse = {
      accessToken: signedPayload,
      expiresIn: expires,
    };

    return this.mapperService.map<LoginResponseVm>(
      token,
      LoginResponseVm.name,
      LoginResponse.name,
    );
  }

enter image description here

IJwtPayload.ts

export interface IJwtPayload {
  sub: string;
  iat?: number;
  exp?: number;
  jti?: string;
}

Но когда запустите проект и заполните заголовок авторизации запроса сгенерированным токеном доступа Bearer и установите точку останова для следующего метода validate. полезные данные имеют значение, но payload.sub не определено! Почему?

jwt-Strategy.ts

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(
    private readonly tokenService: TokenService,
    configurationService: ConfigurationService,
  ) {
    super({
      jwtFromRequest: ExtractJwt.fromExtractors([
        ExtractJwt.fromAuthHeaderAsBearerToken(),
        ExtractJwt.fromUrlQueryParameter('access_token'),
      ]),
      secretOrKey: configurationService.JWT.Key,
      passReqToCallback: true,
    });
  }

  async validate(payload: IJwtPayload) {

    console.log(payload.sub); // <<--- Problem: payload.sub is undefined!
    const result = await this.tokenService.validatePayload(payload);
    if (!result) {
      throw new UnauthorizedException();
    }
    return result;
  }
}

enter image description here

1 Ответ

0 голосов
/ 16 марта 2020

Я заменил эту подпись:

async validate(payload: IJwtPayload) {

На эту

async validate(req: Request, payload: IJwtPayload, done: Function) {

    const result = await this.tokenService.validatePayload(payload);
    if (!result) {
       return done(new UnauthorizedException(), false);
    }
    done(null, result);
}

Я нашел выше подпись здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...