如何使用 jwt 令牌获取用户 ID

Posted

技术标签:

【中文标题】如何使用 jwt 令牌获取用户 ID【英文标题】:How to get user id using jwt token 【发布时间】:2020-12-18 05:28:55 【问题描述】:

我试图从 JWT 令牌中获取用户 ID。我得到了一个 JWT 令牌并成功验证了它,但它没有返回一个 id。

当我解码 JWT 时:

const decoded = jwt.verify(token, config.get('jwtPrivateKey'));  
var userId = decoded.id  
console.log(decoded)  

我得到了这个输出:

 iat: 1561463667 

但我排除了这个输出:

id :"*****************"

如何从令牌中获取用户 ID?

【问题讨论】:

展示你的表现jwt.sign 你如何编码你的 jwt? 只需控制台 decode 并分享您从中获得的信息。 我只得到了相同的输出 iat: 1561463667 这意味着您的令牌没有其他数据。无论如何它都缺少id 字段。你的代码没有错,你的令牌错了。 【参考方案1】:

当整个输出为 iat: 1561463667 时,这意味着在签署令牌时没有添加额外的有效负载/声明。 jsonwebtoken package 通常会添加iat (issuedAt,即颁发令牌的时间)作为默认声明。

简单来说:您只能解码之前添加的声明。

要添加更多声明,请尝试以下代码(当您控制颁发令牌的代码时):

let payload =  "id" : "1";
let token = jwt.sign( payload,'secret',   noTimestamp:true, expiresIn: '1h' );

在这里我添加了一个expiry time (exp),并设置了noTimestamp 选项来禁止自动添加的iat 声明。

结果如下:


 "id": "1",
 "exp": 1561471747

和令牌:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEiLCJleHAiOjE1NjE0NzI0MzV9.jmKyITRoxLl0fy0-rrwgPOA_iRgGQu8W4Cc6dPupOMA

然后您可以获取问题中已经显示的 id:

const decoded = jwt.verify(token, "your secret or key");  
var userId = decoded.id  
console.log(userId)  

您还可以将上面显示的 JWT 或您的令牌粘贴到 https://jwt.io 调试器中,以检查令牌并查看结构和实际声明名称。可能没有id,而是userId 或类似名称,或者subclaim,这是一个用于标识主体的注册声明名称:

“子”(主体)声明标识了作为主体的主体 JWT 的主题。

也可能发生,令牌包含嵌套对象,例如:


  "user_data": 
    
      "user_id": "1",
      "user_name: "superuser"
    ,
 "exp": 1561471747

然后你通过这种方式获得 user_id:

const decoded = jwt.verify(token, "your secret or key");  
var userId = decoded.user_data.user_id  
console.log(userId)  

【讨论】:

在此,您有跳过令牌到期时间。 当然应该加上exp,但这不是这里问题的重点。 我认为这就是问题的重点,听说他使用decode.id 时有到期时间。当预期输出是用户的 id 时,他得到了到期时间值。 不,他没有得到到期时间,正如我解释的那样,他得到了 iat(发布时间)时间。那是签署令牌的时候。而且,正如我所说,框架会自动添加它。我在答案中添加了 expiryTime 的代码。

以上是关于如何使用 jwt 令牌获取用户 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JWT 令牌中获取用户 ID

如何从 jwt 令牌中获取用户 ID?

如何使用基于 JWT 令牌的 express 获取经过身份验证的用户信息

Laravel,如何从自定义表的 jwt 令牌获取登录用户

如何从 Node.js 中的 jwt 令牌获取 user.id?

如何使用 B2C 和 Blazor 获取 JWT 不记名令牌