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