【发布时间】:2020-10-29 03:41:59
【问题描述】:
使用 Postman 测试我的端点,我能够成功“登录”并接收 JWT 令牌。现在,我正在尝试访问一个应该具有 AuthGuard 的端点,以确保我现在已经登录,现在可以访问它。
但是,即使在 Postman 中提供 JWT 令牌,它也会不断返回 401 Unauthorized。
这是我的代码:
user.controller.ts
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@UseGuards(AuthGuard())
@Get()
getUsers() {
return this.usersService.getUsersAsync();
}
}
jwt.strategy.ts
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(
private readonly authenticationService: AuthenticationService,
) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: 'SuperSecretJWTKey',
});
}
async validate(payload: any, done: Function) {
console.log("I AM HERE"); // this never gets called.
const user = await this.authenticationService.validateUserToken(payload);
if (!user) {
return done(new UnauthorizedException(), false);
}
done(null, user);
}
}
我也尝试过ExtractJWT.fromAuthHeaderWithScheme('JWT'),但这不起作用。
authentication.module.ts
@Module({
imports: [
ConfigModule,
UsersModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.register({
secret: 'SuperSecretJWTKey',
signOptions: { expiresIn: 3600 },
}),
],
controllers: [AuthenticationController],
providers: [AuthenticationService, LocalStrategy, JwtStrategy],
exports: [AuthenticationService, LocalStrategy, JwtStrategy],
})
export class AuthenticationModule {}
authentication.controller.ts
@Controller('auth')
export class AuthenticationController {
constructor(
private readonly authenticationService: AuthenticationService,
private readonly usersService: UsersService,
) {}
@UseGuards(AuthGuard('local'))
@Post('login')
public async loginAsync(@Response() res, @Body() login: LoginModel) {
const user = await this.usersService.getUserByUsernameAsync(login.username);
if (!user) {
res.status(HttpStatus.NOT_FOUND).json({
message: 'User Not Found',
});
} else {
const token = this.authenticationService.createToken(user);
return res.status(HttpStatus.OK).json(token);
}
}
}
在 Postman 中,我可以使用我的登录端点以正确的凭据成功登录并接收 JWT 令牌。然后,我在 GET 请求中添加了一个 Authentication 标头,复制并粘贴到 JWT 令牌中,我尝试了“Bearer”和“JWT”两种方案,并且都返回 401 Unauthorized,如下图所示。
我使用了 JWT.IO 调试器来检查我的令牌是否有任何问题并且它看起来是正确的:
我不知道这可能是什么问题。任何帮助将不胜感激。
【问题讨论】:
-
问题可能出在 Postman 的请求中。尝试创建新请求并小心您在标头中放置的内容。如果您使用的是不记名令牌,请将其放在身份验证部分,而不是标题中。或者将其放在标题中,而不是在 auth 部分。做一些实验,会有帮助的。
标签: passport.js nestjs jwt-auth passport-jwt