首页 > 解决方案 > Passport JwtStrategy 从未在 Nestjs 中执行

问题描述

我正在使用nestjs,并且在使用警卫对请求进行身份验证时遇到问题。我的 JwtStrategy 永远不会执行。

这是我的 JwtStrategy :

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

  validate = async (payload: IJwtPayload) => {
    Logger.log('INNNNN');

    const query = new GetUserByIdQuery();
    query.id = payload.id;

    const user = await this.queryBus.execute(query);
    if (!(user instanceof User)) {
      throw new UnauthorizedException();
    }

    return user;
  };
}

我也尝试validate()直接在构造函数中直接调用,但没有任何改变......

我的 AuthModule :

@Module({
  imports: [
    BusModule,
    JwtModule.register({
      secretOrPrivateKey: process.env.JWT_SECRET_KEY,
      signOptions: {
        expiresIn: process.env.JWT_EXPIRES,
      },
    }),
    PassportModule.register({ defaultStrategy: 'jwt' }),
    TypeOrmModule.forFeature([User]),
  ],
  controllers: [RegisterAction, LoginAction],
  providers: [
    JwtStrategy,
  ],
})
export class AuthModule {}

我的控制器

@Get('/:id')
  @ApiOperation({ title: 'Get user ressource' })
  @UseGuards(AuthGuard('jwt'))
  async index(@Param() query: GetUserByIdQuery): Promise<object> {
    const user = await this.queryBus.execute(query);

    if (!(user instanceof User)) {
      throw new NotFoundException();
    }

    return {
      id: user.id,
      fullName: user.getFullName(),
      email: user.email
    };
  }

我总是收到 401 状态码。

谢谢你的帮助。

标签: nestjs

解决方案


validate仅当您传递有效的 jwt 令牌时才会调用。当令牌使用不同的秘密签名或过期时,validate将永远不会被调用。确保您拥有有效的令牌。您可以使用jwt 调试器检查您的令牌。


推荐阅读