我在 NestJs 中使用 AuthGuard 来验证请求 jwt 令牌。由于我的服务只是验证令牌而不是创建它,它不能使用“nbf”验证以避免创建令牌的服务器时间晚于我的服务器的情况。
当使用 jsonwebtoken 库处理纯 node.js 时,很容易添加选项来关闭此验证,方法是添加:
jwt.verify(token, cert, {ignoreNotBefore: true})
这也有效。但是,我怎样才能使用嵌套呢?
这是我的后卫:
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
constructor(private reflector: Reflector,
private authService: AuthService) {
super();
}
async canActivate(context: ExecutionContext) {
const isValid = await super.canActivate(context);
return isValid;
}
handleRequest(err, user, info) {
if (err || !user) {
Logger.error(`Unauthorized: ${info && info.message}`);
throw err || new UnauthorizedException();
}
return user;
}
}
在 JWT 策略中,我尝试在调用 PassportStrategy 的“super”时添加 ignoreNotBefore 选项,但这不起作用:
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(private authService: AuthService,
private config: ConfigService) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
ignoreNotBefore: true,
secretOrKey: fs.readFileSync(config.get('auth.secret')),
});
}
validate(payload: any) {
const isAuthorized = this.authConfig.roles.some((role) => payload.role?.includes(role));
if(!isAuthorized) {
Logger.error(`Unauthorized: Invalid role`);
throw new UnauthorizedException();
}
return true;
}
}
这样做的正确方法是什么?
谢谢。