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

按照指南创buildAzure移动服务的自定义身份提供商后,我可以轻松生成相应的令牌。 代码非常简单,如下所示:

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

zumoJwt的参数和代码的定义位于链接处。 Azure会自动解码令牌,并将请求对象上的用户填充到我想要模拟的对象中。

基本上我想通过节点(而不是.net)解密服务器端的令牌。

令牌没有真正的encryption – 他们只是签名。 令牌具有JWT格式 (为了清楚起见,添加了换行符):

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

如果你想解码(而不是解密)节点中的令牌,你可以分割的值. 字符,取前两个成员,base64解码它们( var buffer = new Buffer(part, 'base64')buffer.toString('utf-8') var buffer = new Buffer(part, 'base64') ),并将缓冲区转换为string( buffer.toString('utf-8') )。

如果要validation令牌,则只需按照与创build令牌相同的方式,使用主密钥对令牌的前两部分(头+'。'+信封)进行重新签名即可执行相同的步骤,并将其与您在原始令牌上收到的签名进行比较。

我最终做了什么来validation令牌是如下(煮沸)。 这似乎是关于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);