Используя Postman для тестирования своих конечных точек, я могу успешно войти в систему и получить токен JWT. Теперь я пытаюсь подключиться к конечной точке, которая предположительно имеет AuthGuard
, чтобы убедиться, что теперь, когда я вошел в систему, я могу получить к ней доступ.
Однако он постоянно возвращает 401 Unauthorized
, даже если представлен токен JWT в Postman.
Вот мой код:
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. Затем я добавляю заголовок Authentication
в запрос GET, копирую и вставляю токен JWT, и я пробовал схемы на предъявителя и JWT, и обе возвращают 401 Unauthorized
, как вы можете видеть на изображениях ниже.
Я использовал отладчик JWT.IO, чтобы проверить, что с моим токеном что-то не так, и он кажется правильным:
Я не понимаю, в чем может быть проблема. Любая помощь будет принята с благодарностью.
jsonwebtoken
и делал что-то вродеimport * as jwt from 'jsonwebtoken'
, за которым следовалоjwt.sign(...)
. При использовании фактическогоJwtService
от@nestjs/jwt
это исправило. 09.07.2020@nestjs/jwt
- это способ пойти с этим подходом! Ваше здоровье! 09.07.2020