0

我在 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;
  }
}

这样做的正确方法是什么?

谢谢。

4

1 回答 1

2

JwtAuthGuard


@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(private authService: AuthService,
              private config: ConfigService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      jsonWebTokenOptions: {
        // this object maps to jsonwebtoken verifier options
        ignoreNotBefore: true,
        // ...
        // maybe ignoreExpiration too?
      },
      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;
  }
}

解释

当此对象映射到验证程序选项时,将您移动ignoreNotBefore到。这就像 Nest.js 已经包裹和包裹一样。所以根对象中的选项主要是配置策略(护照)而不是配置(尽可能多)。jsonWebTokenOptionsjsonwebtokenpassport-jwtpassport-jwtjsonwebtokenjsonwebtoken

学到更多

  1. http://www.passportjs.org/packages/passport-jwt/
于 2021-05-27T13:18:38.217 回答