在node.js中验证一个JWT

在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 

这似乎很奇怪,不是吗?

+1

这可能是因为节点的HMAC函数输出网页或网址的安全哈希和你的代码的其余部分是正确的。 – 2012-01-15 02:10:47

+0

就像那样,我只是更新了 – ConfusedNoob 2012-01-15 03:46:13

感谢蒂莫西米德评论和推动我朝着正确的方向。

节点的缓存类型生成标准的Base64用+,/和=

还有这里提到一个网址安全base64编码:http://en.wikipedia.org/wiki/Base64

它与+替换 - ,/用_和=是可选的。在QueryString(d'uh)上传递的令牌是一个URL安全版本。因此有所不同。

代码固定通过简单:

out = out.replace('+','-').replace('/','_').replace('=',''); 
+0

旧的帖子,但仍然。你的代码不会取代所有的事件。 'out = out.replace(/ \ +/g,' - ')。replace(/ \ // g,'_')。replace(/ =/g,'');' 虽然:) – 2012-06-21 08:26:31

+0

替换(/ =/g,'')将替换所有等号字符,即使它们不在字符串的末尾 – 2013-10-01 00:21:32

我前一段时间写了这个库,我想你可以使用一些代码。它应该在node.js和现代浏览器中运行。