jsonwebtoken,v8.5.0
节点v10.13.0
npm 6.4.1
如果我使用以下方法多次创建令牌:
jwt.sign({ user_email: user_email, user_id: user_id, username: username }, 'RESTFULAPIs')
问题01:
似乎字符串的前2个部分始终是相同的(base64编码的header
和payload
值),但是第三部分(signature
)却不同。
当原始值相同时,signature
为什么不同?
我尝试过的事情:
我已阅读jwt.io/introduction的signature
部分:
要创建签名部分,您必须:
- 编码头
- 编码后的有效载荷
- 秘密
- 标头中指定的算法
并签名。
所以,作为一个猜测:
signature
是使用header
算法和payload
加密base64编码的HS256
和secret
值的结果,在这种情况下是字符串RESTFULAPIs
,每次加密都会产生不同的 result ,而解码结果始终是相同的吗?
问题02:
除了称为iat
的对象属性以外,不同令牌的解码值始终相同。该财产代表什么?
{
iat: 1561358034
user_id: "25423537fshsdgA"
user_email: "info@test.com"
username: "bob"
}
{
iat: 1561358156
user_id: "25423537fshsdgA"
user_email: "info@test.com"
username: "bob"
}
实际上,在进一步研究了第二个问题之后,我遇到了这个问题:
“ iat”(发布于)声明标识了JWT的时间 发行。此声明可用于确定JWT的年龄。它的 值必须是包含NumericDate值的数字。
答案 0 :(得分:0)
根据docs:
默认情况下,生成的jwts将包括
iat
(在处发出)声明,除非 指定了noTimestamp
。如果将iat
插入有效负载中,它将 用于代替实时时间戳来计算其他内容 例如exp
在options.expiresIn
中有一个时间跨度。
因此,您可以测试在同一秒内生成多个jwt(因此将具有相同的iat
)并验证签名是否相同。或者,使用noTimestamp
选项,该选项将消除iat
并因此使有效载荷相同。我认为这不是推荐的方法。
但是简而言之,iat
是在您回答自己时“发出”的,并且随着插入的iat
的变化,有效负载(因此签名)将每秒变化一次我为您引用的文档。