我正在使用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状态代码。
谢谢你的帮助。
只有在传递有效的jwt令牌时才会调用validate
。当令牌使用不同的秘密签名或过期时,将永远不会调用validate
。确保您拥有有效的令牌。您可以使用jwt debugger检查您的令牌。