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

har*_*nth 7 node.js access-token jwt express-jwt

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

当我解码 JWT 时:

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

我得到了这个输出:

{ iat: 1561463667 }
Run Code Online (Sandbox Code Playgroud)

但我排除了这个输出:

id :"*****************"
Run Code Online (Sandbox Code Playgroud)

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

jps*_*jps 7

当整个输出为 时{ iat: 1561463667 },这意味着在签名令牌时没有添加额外的有效负载/声明。所述jsonwebtoken包通常添加iat(issuedAt,当发出该令牌的时间)作为默认权利要求。

简而言之:您只能解码之前添加的声明。

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

let payload = { "id" : "1"};
let token = jwt.sign( payload,'secret',  { noTimestamp:true, expiresIn: '1h' });
Run Code Online (Sandbox Code Playgroud)

这里我加了一个过期时间( exp),并设置了noTimestamp抑制自动添加的选项iat声明。

结果如下所示:

{
 "id": "1",
 "exp": 1561471747
}
Run Code Online (Sandbox Code Playgroud)

和令牌:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEiLCJleHAiOjE1NjE0NzI0MzV9.jmKyITRoxLl0fy0-rrwgPOA_iRgGQu8W4Cc6dPupOMA
Run Code Online (Sandbox Code Playgroud)

然后你可以得到你在问题中已经显示的 id:

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

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

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

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

{
  "user_data": 
    {
      "user_id": "1",
      "user_name: "superuser"
    },
 "exp": 1561471747
}
Run Code Online (Sandbox Code Playgroud)

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

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