【发布时间】:2019-12-15 14:26:03
【问题描述】:
出于教育目的,我正在尝试用 JavaScript 制作 JWT 生成器。有一个 jwt.io 工具可以创建和/或验证 JWT。
我正在努力让我的结果与验证器的结果相匹配。问题是签名。
这是我的代码:
function base64url(input) {
return btoa(typeof input === 'string' ? input : JSON.stringify(input))
.replace(/=+$/, '')
.replace(/\+/g, '-')
.replace(/\//g, '_');
}
const JWT = {
encode(header, payload, secret) {
const unsigned = [base64url(header), base64url(payload)].join('.');
return [unsigned, base64url(sha256.hmac(secret, unsigned))].join('.');
}
};
为了加密 HMAC SHA256,我使用了 js-sha256 库和 sha256.hmac(key, value) 原型。我将它与在线工具进行了比较,效果很好。
现在,我使用以下代码对其进行测试:
const jwt = JWT.encode(
{
alg: 'HS256',
typ: 'JWT'
},
123,
'xxx'
);
我得到的结果是:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.MTIz.NzhlNTFmYzUxOGQ2YjNlZDFiOTM0ZGRhOTUwNDFmMzEwMzdlNmZkZWRhNGFlMjdlNDU3ZTZhNWRhYjQ1YzFiMQ
另一方面,jwt.io 的结果是:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.MTIz.eOUfxRjWs-0bk03alQQfMQN-b97aSuJ-RX5qXatFwbE
如您所见,在我的结果和jwt.io 结果中,三分之二的 JWT 块是相同的。签名不同,如果你问我,它生成的签名非常短。该工具还将我自己的 JWT 标记为无效。
我检查了在线 HMAC SHA256 生成器,看起来我的代码创建了一个有效的签名,所以:
base64url(sha256.hmac('xxx', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.MTIz')) ===
'NzhlNTFmYzUxOGQ2YjNlZDFiOTM0ZGRhOTUwNDFmMzEwMzdlNmZkZWRhNGFlMjdlNDU3ZTZhNWRhYjQ1YzFiMQ'
jwt.io 是刚刚坏掉还是以其他方式造成的?
【问题讨论】:
-
我也想知道。它只发生在对称类型
标签: javascript jwt