- 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/
我想知道是否可以在haskell中使用守卫内部的守卫。像这样: analyser modele instr | instr == NoCom = (modele, "No command" ,
我正在尝试在 Windows 7 上将 Guard 与适用于 Chrome 的 LiveReload 插件一起使用。它不起作用,我不知道如何解决这个问题。我使用 Bash 启动防护,然后在浏览器中激活
我有以下代码。我正在检查 3 个条件。您可以看到,对于第一个条件,我将 xml:get_tag_attr_s(...) 的输出存储在变量中,然后在 if block 中使用该变量。我的问题是,如果我尝
是否有类似于自动测试的 ctrl+c 强制运行所有规范的东西?我仍在努力微调我的 .Guardfile,但目前我可以在不重新启动 guard 的情况下强制运行所有规范吗? ctrl+c 退出守卫。 最
我刚刚在 Angular 大学完成了关于 Angular 2 和 Firebase 的 Angular 2 类(class)。 讲师 Vasco (@angular-university) 提出 Ro
我正在使用 guard-zeus我的应用程序中的 gem gem 的行为符合预期,但控制台的输出全部失真。 看起来像是添加了额外的制表符,所以这些行没有按应有的方式断开 有人知道如何解决这个问题吗?
有人可以解释 Xcode 中这些选项的作用吗? 启用涂鸦 启用防护边缘 启用Guard Malloc 它们是什么、它们做什么以及它们对调试/测试有多大用处? 谢谢。 最佳答案 来自documentat
我关注了 "How I Test" screencast at RailsCasts ,但是我遇到了 spork 的问题 $ guard Guard is now watching at '/User
以下代码被mix视为错误: case test do ... t when !is_list(t) -> false ... end 错误是“防护中的表达式无效,防
我知道可以像这样使用 guard 语句 guard let someConstant = someOptional() else { // ... } 我试着去做 struct MyStruc
我按照 Michael Hartl 的 Rails 教程使用 Spork 运行 Guard,我遇到了这个问题。以下是错误信息: 20:45:58 - INFO - Starting Spork for
尝试在我的 ubuntu 机器上安装 Guard,但是当我尝试从命令行运行它时出现此错误: No command 'guard' found, did you mean: Command 'guar
我是 Laravel 的新手。我正在浏览默认的身份验证中间件,我看到它正在使用: Auth::guard($guard)->guest() 检查用户是否是访客。 文档位于 https://larave
我正在通过 Ruby on Rails 教程(Michael Hartl)学习 RoR。 现在我尝试使用 Guard 运行测试。 我的 gem 文件: source 'https://rubygems
请帮我解决这个问题 我想使用多重身份验证。 我的 Laravel 版本是 5.2.* (5.2.29) 文档中写的我都做 //congig/auth.php [ 'guard' => 'we
Guard-RSpec 在自述文件中提到可以通过指定自定义 cmd 使用 spring 运行规范: guard :rspec, cmd: 'spring rspec' do # ... end 这
Guard-RSpec 在自述文件中提到可以通过指定自定义 cmd 使用 spring 运行规范: guard :rspec, cmd: 'spring rspec' do # ... end 这
一 点睛 当线程在访问某个对象时,发现条件不满足,就暂时挂起等待条件满足时再次访问,这就是 Guarded Suspension 设计模式。该设计模式的关注点在于临界值的条件是否满足,当达到设置的临界
我正在制作一个步骤向导,并试图阻止用户导航到即将到来的页面路由,除非他们导航到这些步骤,但允许他们导航到之前的页面/步骤。 我目前的解决方案是为每个页面/步骤指定一个步骤编号,但它不允许导航到前面的步
其他stackoverflow-ers, 我目前正在学习 Erlang。 有人可以指出我为什么会收到 illegal guard expression用这个守卫? add_new_prime(Idx,
我是一名优秀的程序员,十分优秀!