整个输出是
{ 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
或类似的内容,或者有一个
sub
claim,这是一个注册声明名称,用于标识主体:
"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)
jwt.sign
。 - Sachin Shahid
字段。你的代码没错,是你的令牌有问题。 - smassey