44 lines
1.3 KiB
JavaScript
44 lines
1.3 KiB
JavaScript
'use strict';
|
|
|
|
var crypto = require('crypto');
|
|
var JWT = module.exports;
|
|
|
|
JWT.decode = function (jwt) {
|
|
var parts;
|
|
|
|
try {
|
|
parts = jwt.split('.');
|
|
return {
|
|
header: JSON.parse(Buffer.from(parts[0], 'base64'))
|
|
, payload: JSON.parse(Buffer.from(parts[1], 'base64'))
|
|
, signature: parts[2] //Buffer.from(parts[2], 'base64')
|
|
};
|
|
} catch(e) {
|
|
throw new Error("JWT Parse Error: could not split, base64 decode, and JSON.parse token " + jwt);
|
|
}
|
|
};
|
|
|
|
JWT.verify = function (jwt) {
|
|
var decoded = JWT.decode(jwt);
|
|
throw new Error("not implemented yet");
|
|
};
|
|
|
|
function base64ToUrlSafe(str) {
|
|
return str
|
|
.replace(/\+/g, '-')
|
|
.replace(/\//g, '_')
|
|
.replace(/=/g, '')
|
|
;
|
|
}
|
|
|
|
JWT.sign = function (claims, key) {
|
|
if (!claims.iat && false !== claims.iat) {
|
|
claims.iat = Math.round(Date.now()/1000);
|
|
}
|
|
var thumb = base64ToUrlSafe(crypto.createHash('sha256').update(key).digest('base64'));
|
|
var protect = base64ToUrlSafe(Buffer.from(JSON.stringify({ alg: 'HS256', typ: 'JWT', kid: thumb })).toString('base64'));
|
|
var payload = base64ToUrlSafe(Buffer.from(JSON.stringify(claims)).toString('base64'));
|
|
var signature = base64ToUrlSafe(crypto.createHmac('sha256', key).update(protect + '.' + payload).digest('base64'));
|
|
return protect + '.' + payload + '.' + signature;
|
|
};
|