在服务器端的 Azure 移动服务令牌上解密或验证签名



按照为 Azure 移动服务创建自定义标识提供者的指南进行操作后,我可以轻松生成相应的令牌。 代码非常简单,如下所示:

var userAuth = {
  user: { userId : userId },
  token: zumoJwt(expiry, aud, userId, masterKey)
}
response.send(200, userAuth);

zumoJwt 的参数和代码的定义位于链接中。 Azure 会自动解码令牌并在请求对象上填充用户,这就是我想模拟的内容。

基本上我想通过 Node(不是 .net)在服务器端解密令牌。

我最终为验证令牌所做的工作如下(归结)。 这似乎是关于 Azure 移动服务在需要授权的路由上执行的操作。

var jws = require('jsw');   // https://github.com/brianloveswords/node-jws 
function userAuth() {
    var token = ''; // get token as header or whatever
    var key = crypto.createHash('sha256').update(global.masterKey + "JWTSig").digest('binary');  
    if (!jws.verify(token,key)) { 
      // invalid token logic
    }  else {
       var decode = jws.decode(token)
       req.user = {
          userId: decode.payload.uid.split(';')[0].split('::')[0]
       };
       next();
    }
}
app.use(authChecker);

令牌并没有真正加密 - 它们只是经过签名。令牌具有 JWT 格式(为清楚起见,添加了换行符):

<header>, base64-encoded
"."
<envelope>, base64-encoded
"."
<signature>, base64-encoded

如果要解码(而不是解密)节点中的令牌,可以将值拆分为.字符,获取前两个成员,对它们进行base64解码(var buffer = new Buffer(part, 'base64')),然后将缓冲区转换为字符串(buffer.toString('utf-8'))。

如果要验证令牌,只需按照与创建令牌相同的步骤操作,使用主密钥对令牌的前两部分(标头 + '." + 信封)重新签名,并将其与您在原始令牌上收到的签名进行比较。

最新更新