AdonisJs - 自定义 JWT uid 字段键

Posted

技术标签:

【中文标题】AdonisJs - 自定义 JWT uid 字段键【英文标题】:AdonisJs - Custom JWT uid field key 【发布时间】:2020-04-03 11:19:42 【问题描述】:

我使用 Laravel 和 Laravel Passport 构建了一个 API。 一切都很好,但我现在想要实现的是使用 AdonisJs 构建一个新的 API - 用于网站的一些较小的东西,但两个框架的身份验证相同 - 我想这可以使用 JWT 令牌。

Laravel 和 Adonis 都配置为使用相同的私钥/公钥进行加密。 我面临的问题是通过 Laravel 登录后,我无法从令牌中读取用户,这是由于 JWT 对象不同。

Adonis 期望有效负载具有 uid 属性,这在 Laravel 护照制作的令牌中不存在。

下面是passport创建的token:

 aud: '9',
  jti:
   'ab9d81a20ed72e263f3f6bacef91962bfcb41b5523787fa301f56fa4978e5ae9ceb22dccbfb9fcef',
  iat: 1575970326,
  nbf: 1575970326,
  exp: 1607592726,
  sub: '332',
  scopes: [],

还有,这是阿多尼斯创建的令牌

 uid: 332, iat: 1575971236 

有什么方法可以从 Laravel 设置 uid,或者从 Adonis 读取不同的字段?

谢谢!

【问题讨论】:

【参考方案1】:

如果我正确阅读了您的问题,您只想更改用于 JWT uid 字段的模型键,默认情况下是数据库中记录的 id。这是因为 Adonis JWT 实现默认使用模型主键。

要覆盖它,请在您的用户模型(或您在 config/auth.jsjwt.model 模型中设置的任何模型)中设置

static get primaryKey() 
  return 'uuid' // Or whatever you want to be the uid

注意:如果模型的主键是 UUID,这可能会对关系和查询性能产生副作用

【讨论】:

【参考方案2】:

也许你可以这样做:

创建令牌时在令牌中添加额外字段

 $customClaims = ['token_for' => `web` or 'mobile'];
 $token = JWTAuth::claims($customClaims)->fromUser($user);

并签入任何中间件或您需要的任何地方

  $payload = JWTAuth::parseToken()->getPayload();
  $tokenFor = $payload->get('token_for');

现在在这里检查 $tokenFor webmobile

并根据您对webmobile 的需要进行进一步处理

【讨论】:

我进行了搜索,但没有找到通过护照向令牌添加自定义声明的方法。你对此有什么参考吗?谢谢!

以上是关于AdonisJs - 自定义 JWT uid 字段键的主要内容,如果未能解决你的问题,请参考以下文章

使用 JWT 令牌使用 AdonisJS 注销

MongoDB Stitch JWT 自定义身份验证:需要有效的 UID(介于 1 到 128 个字符之间)

如何使用 JJWT 从有效负载中获取自定义字段

passwd shadow group gshadow文件字段说明

Rails - 更新单个属性:与自定义操作或带有隐藏字段的表单链接?

nestjs 使用jwt实现认证