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

9

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

当我解码JWT时:

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

我得到了这个输出结果:

{ iat: 1561463667 }

但我期望的输出是这样的:
id :"*****************"

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


1
展示一下你如何使用 jwt.sign - Sachin Shah
你是如何对JWT进行编码的? - Potato
只需在控制台中输入“decode”,并分享您得到的内容。 - Sachin Shah
我只得到了相同的输出 { iat: 1561463667 }。 - hari prasanth
这意味着你的令牌没有其他数据...无论如何,它都缺少id字段。你的代码没错,是你的令牌有问题。 - smassey
@SachinShah 谢谢你的提示! - gignu
1个回答

11
整个输出是{ iat: 1561463667 }时,这意味着在签署令牌时没有添加额外的有效载荷/声明。 jsonwebtoken包通常会添加iat(发行时间)作为默认索赔。
简单来说:您只能解码之前添加的索赔。
要添加更多索赔,请尝试使用此代码(当您控制发放令牌的代码时):
let payload = { "id" : "1"};
let token = jwt.sign( payload,'secret',  { noTimestamp:true, expiresIn: '1h' });

在这里,我添加了一个过期时间(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,这是一个注册声明名称,用于标识主体:

"sub"(主题)声明标识了作为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)  

在这里,您可以跳过令牌的到期时间。 - Sachin Shah
当然需要添加exp,但这不是问题的重点。 - jps
我认为这就是问题的重点,当他使用decode.id时,他得到了到期时间。当期望的输出是用户ID时,他得到了到期时间值。 - Sachin Shah
不,他没有得到过期时间,正如我所解释的那样,他得到了iat(签发时间)。那是令牌签名的时间。而且,正如我所说,框架会自动添加这个。我在我的答案中添加了expiryTime的代码。 - jps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接