【问题标题】:Auth JWT in decorator in NESTJS在 NESTJS 的装饰器中验证 JWT
【发布时间】:2021-11-25 22:07:54
【问题描述】:

如何在 nestjs 的装饰器中解码 jwt cookie?我不能在装饰器中使用“private readonly jwtService: JwtService”,我使用 jwt-decode 但它仍然可以在 jwt 过期时工作

【问题讨论】:

  • 为什么不使用保护解码和验证 JWT,然后将有效负载设置为 req 上的属性?
  • @JayMcDoniel 因为我的老师需要通过装饰器获取当前用户
  • 这仍然可行。您使用警卫使用JwtService 对其进行解码,然后使用装饰器从req 对象中获取信息并进入控制器

标签: jwt nestjs


【解决方案1】:

在这种情况下,您可以创建custom decorator

//user.decorator.ts
import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const User = createParamDecorator((data: any, ctx: ExecutionContext) => {
  const request = ctx.switchToHttp().getRequest();
  return request.user;
});

现在我们可以在控制器中使用这个 User 装饰器了

//user.controller.ts
import { User } from './user.decorator';

@Get()
async getUser(@User() user) {
  //console.log(user);
}

【讨论】:

  • 返回类型呢?有没有办法让它不返回any
  • @EnriqueDev 在这种情况下,您可以删除 data 参数,因为我们没有在 @User() 装饰器中传递任何内容。但是如果你传递类似@User('userId') 的东西,那么你可以将返回类型添加为'string'。但是,如果您传递一个参数,那么您将只能访问用户对象的特定字段。
  • 我明白你的意思,但我想知道是否有办法让装饰器 infer 自动返回类型。
【解决方案2】:

您应该必须使用 AuthGuard 来解码 JwtToken

请参考以下来自 NestJs 的文档 https://docs.nestjs.com/security/authentication#implementing-passport-jwt

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2020-03-04
  • 2021-02-09
  • 2021-11-03
  • 2021-03-02
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2021-05-17
相关资源
最近更新 更多