Я работаю над приложением 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](https://i.stack.imgur.com/9WB0A.png)
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](https://i.stack.imgur.com/S4Hdt.png)