aozhiwei b29f7ab025 1
2024-06-03 11:35:43 +08:00

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;