在node.js中验证一个JWT
我试图解析和验证基于此示例node.js的一个JWT令牌(在.NET编写):https://github.com/liveservices/LiveSDK/blob/master/Samples/Asp.net/AuthenticationTokenSample/JsonWebToken.cs在node.js中验证一个JWT
这里是我的节点JS的JavaScript验证令牌:
var validateSignature = function(key, claims, envelope, signature) {
var hasher = crypto.createHash('sha256');
hasher.update(key + "JWTSig");
var key = hasher.digest('binary');
var hmac = crypto.createHmac('sha256', key);
hmac.update(envelope + '.' + claims);
var out = hmac.digest('base64');
console.log(out);
console.log(signature);
console.log(out === signature);
}
现在,非常奇怪的是 - 它几乎可行。这里有三个的console.log语句的输出:
pEwNPJ+LUHBdvNx631UzdyVhPFUOvFY8jG3x/cP81FE=
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
false
看来可疑的,我认为哈希值是除了两个相同的+ -/_ =
有人发现我的错误?与我的base64编码有关。
UPDATE
我打出了一些更多,似乎有什么时髦与base64编码怎么回事。在节点JS下面的代码:
console.log(signature);
var b = new Buffer(signature, 'base64');
console.log(b.toString('base64'));
产量:
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
pEwNPJLUHBdvNx631UzdyVhPFUOvFY8jG3xcP81F
这似乎很奇怪,不是吗?
感谢蒂莫西米德评论和推动我朝着正确的方向。
节点的缓存类型生成标准的Base64用+,/和=
还有这里提到一个网址安全base64编码:http://en.wikipedia.org/wiki/Base64
它与+替换 - ,/用_和=是可选的。在QueryString(d'uh)上传递的令牌是一个URL安全版本。因此有所不同。
代码固定通过简单:
out = out.replace('+','-').replace('/','_').replace('=','');
旧的帖子,但仍然。你的代码不会取代所有的事件。 'out = out.replace(/ \ +/g,' - ')。replace(/ \ // g,'_')。replace(/ =/g,'');' 虽然:) – 2012-06-21 08:26:31
替换(/ =/g,'')将替换所有等号字符,即使它们不在字符串的末尾 – 2013-10-01 00:21:32
这可能是因为节点的HMAC函数输出网页或网址的安全哈希和你的代码的其余部分是正确的。 – 2012-01-15 02:10:47
就像那样,我只是更新了 – ConfusedNoob 2012-01-15 03:46:13