- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 Postman 测试我的端点,我能够成功“登录”并接收 JWT token 。现在,我试图点击一个据说有 AuthGuard
的端点。以确保现在我已登录,我现在可以访问它。
但是,它不断返回401 Unauthorized
即使在 Postman 中提供了 JWT token 。
这是我的代码:
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')
也是,但这不起作用。
@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 token 。然后,我添加一个
Authentication
头到 GET 请求,复制并粘贴到 JWT token 中,我尝试了“承载”和“JWT”方案,都返回
401 Unauthorized
如下图所示。
最佳答案
请注意 validate()
只有在成功验证 JWT 后才会调用 JWT 策略中的函数。如果您在尝试使用 JWT 时始终收到 401 响应,那么您不能期望调用此函数。return
来自 validate()
方法被注入(inject)到任何受 JWT 身份验证保护的操作的请求对象中。
我不确定 done()
您正在调用的函数,但这是一个有效的 validate()
来自我当前项目的方法:
async validate(payload: JwtPayload): Promise<User> {
const { email } = payload
const user = await this.authService.getActiveUser(email)
if (!user) {
throw new UnauthorizedException()
}
return user
}
看起来您在返回用户的愿望上走在正确的轨道上。确定这就是
authenticationService.validateUserToken()
事实上。
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()
似乎是正确的,并且在 Postman 中使用带有
Bearer TOKEN
的 Authorization header 看起来也正确。
authentication.controller.ts
文件,小心使用
@Request
和
@Response
直接在 NestJS Controller 中的对象。这些访问底层框架,例如Express 并且有可能绕过 Nest 实现的许多功能。引用
https://docs.nestjs.com/faq/request-lifecycle看看你在跳过什么...
@Get()
、
Post()
等)返回对象并抛出错误,框架将处理其余部分:HTTP 代码、JSON 等。
@Reponse res
并使用
throw new UnauthorizedException('User Not Found')
和一个简单的
return { token }
(或类似)方法代替。
AuthGuard('jwt')
在某些情况下效果更好并且不会产生警告,即使您确实将默认策略设置为 JWT。
AuthGuard('local')
吗?在您的登录路线上?
loginAsync()
内方法不要忘记使用有效负载实际签署 token 的关键步骤。您没有提供
createToken()
的代码方法实现在您的身份验证服务中,但我怀疑这可能是您所缺少的。
async login(authCredentialsDto: AuthCredentialsDto): Promise<{ accessToken: string }> {
const { email, password } = authCredentialsDto
const success = await this.usersRepository.verifyCredentials(email, password)
if (!success) {
throw new UnauthorizedException('Invalid credentials')
}
// roles, email, etc can be added to the payload - but don't add sensitive info!
const payload: JwtPayload = { email }
const accessToken = this.jwtService.sign(payload)
this.logger.debug(`Generated JWT token with payload ${JSON.stringify(payload)}`)
return { accessToken }
}
请注意
jwtService
通过添加
private jwtService: JwtService
通过依赖注入(inject)注入(inject)到类中到构造函数参数。
JwtPayload
定义接口(interface)的。所以它是显式输入的。这比使用
any
更好就像您在代码中一样。
Bearer ${token}
.
关于passport.js - Nest.js Auth Guard JWT 身份验证不断返回 401 未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62799708/
在查看Thermostat Guide时,我没有提到湿度读数。这些数据可以通过API获得吗?会在以后的版本中吗? 最佳答案 从NestAPI v1.1开始,似乎湿度数据可以作为只读字段使用。 可以在v
我从以下位置获取了授权码 https://home.nest.com/login/oauth2?client_id=CLIENT_ID&state=FOO . 我想获取access_token,但是出
使用1.1.2版本的Nest,似乎至少有3种索引多个文档的方法: IndexMany client.IndexMany(documents, "index_name", "type_name"); 使
我有2个POJO(人和车),其中一个由另一个人引用 @Document(indexName = "person", type = "user") public class Person { @
Nest Protect(烟雾和一氧化碳警报)可以测量温度和湿度,但官方或非官方 API 似乎都不允许访问这些数据。有人在工作吗?任何视线访问这些数据?建议?谢谢! 最佳答案 $infos = (o
自从我得到 Nest 以来,我所想要的就是能够在很长一段时间内汇总我的能量使用情况以寻找模式,主要是满足我的好奇心。当然有每月使用报告,而且网络和设备只能追溯到 10 天。 API 是否公开了这些数据
我在获取和更改 Nest 恒温器提供的一些基本数据时遇到了问题。 使用命令行,我如何获取或更改恒温器上的个别设置或值? 最佳答案 这是几个用户的汇编,解释了如何检索或更改一些基本信息,并添加了我自己的
我和我的一位同事就以下最佳实践问题进行了讨论。 大多数函数/方法都从一些参数检查开始。 我提倡以下风格,避免嵌套。 if (parameter one is ugly) return ERROR; i
我有 4 个表: ChatRooms Participants Messages Users 聊天室有很多参与者 聊天室有很多消息 用户有很多消息 用户有很多参与者 参与者属于用户 消息属于用户 我正
我编写了以下函数并得到如下所示的响应: public async Task ShowMapping(string indexname) { var resu
我正在使用 NEST 为我的对象编制索引,但在序列化时遇到了 Newtonsoft 错误。我的一个对象有一个自引用循环。有没有一种方法可以让我访问 JsonSerializer 并更改它处理自引用的方
设置目标温度会引发如下错误。我正在使用 php curl 来设置温度。任何帮助表示赞赏。 object(stdClass)#72 (2) { ["cmd"]=> stri
我编写了以下函数并得到如下所示的响应: public async Task ShowMapping(string indexname) { var resu
我正在使用 Nest Developer https://developer.nest.com/用于创建 iOS 应用程序的 API。有谁知道如何将 Firebase 框架链接到我的应用程序中?我不断
我是名为 Feather (featherapp.co) 的综合性 Apple TV 应用程序的开发者。我遇到的一个问题是用户希望能够查看他们相机的实时画面。 有没有人确定访问摄像头实时画面的方法?我
免责声明 - 我担心这个问题可能是重复的,因为功能看起来很基本,所以我知道我可能会得到一个骗局。但我找不到有效的解决方案 所以我有一个可观察的数组设置如下 self.meetingAttendees
我正试着给我的模块提供一个令牌。该模块如下所示:。我将AuthGuardModule导入到的父模块如下所示:。而gardConfigProvider本身如下所示:。但我得到一个错误:Error[Exc
我正试着给我的模块提供一个令牌。该模块如下所示:。我将AuthGuardModule导入到的父模块如下所示:。而gardConfigProvider本身如下所示:。但我得到一个错误:Error[Exc
每 10 秒使用一次访问 token 时遇到太多请求错误。在重新阅读文档时,我意识到这是一个禁忌(“为了避免错误,我们建议您以每分钟一次或更短的速度提出请求”)。 有谁知道我会被限制多久? 最佳答案
我使用嵌套 plist 来创建对象结构(CLOS 类型),将嵌套的对象传递给它的部分。我想以迭代方式 append 嵌套的 plist,但因此我想在时间和内存方面高效地完成它。 以下示例显示了由于一次
我是一名优秀的程序员,十分优秀!