85 lines
1.9 KiB
JavaScript
85 lines
1.9 KiB
JavaScript
const app = require('j7/app');
|
|
const utils = require('j7/utils');
|
|
const base64url = require('base64url');
|
|
const jwksClient = require('jwks-rsa');
|
|
const jwt = require('jsonwebtoken');
|
|
|
|
const LOCK_KEY = 'getJwtLock:';
|
|
const jwksKeyHash = {};
|
|
|
|
async function asyncGetKey(jkwsUri, header, cb) {
|
|
app.lock(LOCK_KEY + jkwsUri);
|
|
try {
|
|
if (jwksUri in jwksKeyHash) {
|
|
const c = jwksKeyHash[jwksUri];
|
|
cb(null, c['key']);
|
|
return;
|
|
}
|
|
const client = jwksClient({
|
|
jwksUri: jwksUri
|
|
});
|
|
client.getSigningKey(header.kid, function(err, key) {
|
|
try {
|
|
const signingKey = key.publicKey || key.rsaPublicKey;
|
|
if (!err) {
|
|
jwksKeyHash[jwksUri] = {
|
|
'key': key,
|
|
'lastRefreshTime': utils.getUtcTime()
|
|
};
|
|
}
|
|
cb(null, signingKey);
|
|
} finally {
|
|
app.unLock(LOCK_KEY + jkwsUri);
|
|
}
|
|
});
|
|
} finally {
|
|
app.unLock(LOCK_KEY + jkwsUri);
|
|
}
|
|
}
|
|
|
|
function asyncVerify(jwksUri, data) {
|
|
return new Promise((resolve) => {
|
|
const ret = {
|
|
err: null,
|
|
decoded: null
|
|
};
|
|
jwt.verify
|
|
(data,
|
|
(header, cb) => {
|
|
asyncGetKey(jwksUri, header, cb);
|
|
},
|
|
(err, decoded) => {
|
|
console.log(err);
|
|
console.log(decoded);
|
|
ret.err = err;
|
|
ret.decoded = decoded;
|
|
resolve(ret);
|
|
});
|
|
});
|
|
}
|
|
|
|
async function verify(session) {
|
|
const postData = session.getBody();
|
|
const jwksUri = postData['jwksUri'];
|
|
//const arr = postData['data'].split('.');
|
|
//const header = base64url.decode(arr[0]);
|
|
//const payload = base64url.decode(arr[1]);
|
|
//const sign = base64url.decode(arr[2]);
|
|
const {err, decoded} = await asyncVerify(jwksUri, postData['data']);
|
|
console.log(err, decoded);
|
|
if (err != null) {
|
|
//console.log(postData);
|
|
session.rspErr(500, err);
|
|
return;
|
|
}
|
|
session.rspData({
|
|
'decoded': decoded
|
|
});
|
|
}
|
|
|
|
function init() {
|
|
app.registerHandler('Jwt', 'verify', verify);
|
|
}
|
|
|
|
exports.init = init;
|