在 node.js 中验证 JWT

Con*_*oob 5 javascript authentication base64 node.js jwt

我正在尝试基于此示例(在 .NET 中编写)解析和验证 node.js 中的 JWT 令牌:https : //github.com/liveservices/LiveSDK/blob/master/Samples/Asp.net/AuthenticationTokenSample/ JsonWebToken.cs

这是我验证令牌的节点 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);
}
Run Code Online (Sandbox Code Playgroud)

现在,非常奇怪的是 - 它几乎可以工作。这是三个 console.log 语句的输出:

pEwNPJ+LUHBdvNx631UzdyVhPFUOvFY8jG3x/cP81FE=
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
false
Run Code Online (Sandbox Code Playgroud)

对我来说,除了 +-/_= 之外,哈希值都是相同的

有人发现我的错误吗?与我的 base64 编码有关。

更新

我又玩了一些,这里的 base64 编码似乎有些奇怪。节点js中的以下代码:

console.log(signature);
var b = new Buffer(signature, 'base64');
console.log(b.toString('base64'));
Run Code Online (Sandbox Code Playgroud)

产量:

pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
pEwNPJLUHBdvNx631UzdyVhPFUOvFY8jG3xcP81F
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪,对吧?

Con*_*oob 4

感谢蒂莫西·米德的评论并推动我走向正确的方向。

Node 的 Buffer 类型生成带有 +、/ 和 = 的标准 Base64

这里提到了一个 URL 安全的 base64 编码: http: //en.wikipedia.org/wiki/Base64

它将 + 替换为 -,/ 替换为 _,= 是可选的。在 QueryString (d'uh) 上传递的令牌是 URL 安全版本。因此存在差异。

代码通过一个简单的修复:

out = out.replace('+','-').replace('/','_').replace('=','');
Run Code Online (Sandbox Code Playgroud)