【问题标题】:How to get user id using jwt token如何使用 jwt 令牌获取用户 ID
【发布时间】:2019-11-07 06:50:46
【问题描述】:

我试图从 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 字段。你的代码没有错,你的令牌错了。

标签: node.js jwt access-token express-jwt


【解决方案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 的代码。
猜你喜欢
  • 2020-05-05
  • 2021-07-05
  • 2019-06-22
  • 2021-10-14
  • 2018-01-09
  • 2018-08-12
  • 2016-07-18
相关资源
最近更新 更多