mock-jwks
Version:
A tool to mock a JWKS for development of microservices who consume jwts signed with RSA
160 lines (142 loc) • 8.27 kB
JavaScript
var $7Izd7$msw = require("msw");
var $7Izd7$mswnode = require("msw/node");
var $7Izd7$nodecrypto = require("node:crypto");
var $7Izd7$base64url = require("base64-url");
var $7Izd7$jsonwebtoken = require("jsonwebtoken");
var $7Izd7$nodeforge = require("node-forge");
var $7Izd7$nodersa = require("node-rsa");
function $parcel$defineInteropFlag(a) {
Object.defineProperty(a, '__esModule', {value: true, configurable: true});
}
function $parcel$export(e, n, v, s) {
Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
}
function $parcel$interopDefault(a) {
return a && a.__esModule ? a.default : a;
}
$parcel$defineInteropFlag(module.exports);
$parcel$export(module.exports, "createJWKSMock", () => $a82e61ab81c9e25c$export$17c94918db2c5155);
$parcel$export(module.exports, "default", () => $a82e61ab81c9e25c$export$2e2bcd8739ae039);
/* HARDCODED MOCK RSA KEYS */ const $fee1848bd04bd180$var$PRIVATE_KEY_PEM = "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEApoocpO3bbUF6o8eyJlQCfwLahEsunWdVF++yOEyKu4Lp1j0m\n2j/P7iHOtxBAkjdM2X2oW3qO1mR0sIFefqnm93g0q2nRuYEoS+W3o6X50wjOVm8f\nr/tLqELzy5BoET0AQl7Axp1DNsb0HNOBcoIBt+xVY4I+k6uXJJJMzbgvahAgSLZ9\nRW0Z0WT+dCHZpZUj0nLxNXIPdci65Bw6IognqXHP6AwKZXpT6jCzjzq9uyHxVcud\nqw6j0kQw48/A5A6AN5fIVy1cKnd0sKdqRX1NUqVoiOrO4jaDB1IdLD+YmRE/JjOH\nsWIMElYCPxKqnsNo6VCslGX/ziinArHhqRBrHwIDAQABAoIBAHAdmpsN5iLvafjI\nf45+EBAhg6p8Uq102zx6CakNHniN8Y5hLL7RJtJRwDBNqKrGv93LUoQDRhXfGw+Y\niF0NVIhVTF/5pU8VPGOcCr0JB96ilwZpWRPIQW7NZAMu/GBeiMYls/IB/TXrSnv9\nh6/nBfEkEXgkPqx7YA0m0L3NuV3U1lCY/LhBJY4Xvi0uRdqu3tTHXftehuPwC4UB\n42eJTWv/qLeOlkCdUUV4f7+dNaES88Vdhj6lu/BusnNhvnwHQik4dNwzPCGeP8NV\n5gaesWiNWFZuTURGKk1B65p5LzNPjsVT50RDuW8FnSZwIvNcohrX9ILPsmg/t0Kr\nozcOksECgYEA4XWOK4twx5RG162zveRHqU7H9RBWSz7/PzM9Eob9vx/tC/b1YqBR\nVShk23vje19eNiYWAkxcpobIP4ek/0ZT8nHkJg8wl+J/hnXADcvwv2dKnoFnm5pn\nrTBUKc8R3wrSlAV8XQAtdnxsfFa5AOQJ6WFVI9AdfH3Iw8XZk4gIIPMCgYEAvRlY\ny80HnR3kwMOqY488V1qk41dmfNqa+YDL+zkPF1HhHI9VnK5BQuI7lyKJl984KwHu\n0gbwx3Wp4XkD5JUboEpl5LnaLsjEWemjTaQWdvJHPd5wkJ0m/jRQ2YeT4g2gFu4y\nPi/pWkrzhnzQQVAmOdAm5Kj27LtDzp0lspw3uCUCgYEAw2YdvFGSgfZZW4147QeO\nsAbON+9bysUjdMPUl10VR/LEgA0d6MdnFfX3S13Y7tDdlvJ1OrKxzcWcgaru7ism\nkEXy5KVfiRNNUNx2gb6RvWEpA6zFfc9ZMXlkSAPlyjfX/1+tw/Bmdn0pjK2gk0wP\n5wtrPameFInzWPD9O+a2nM8CgYBZ6UhgNs+M9B7FTQOiLQPa4R2PfwobCXIwef4D\nKIE1bFgl1T02r2AWZi1BUkmr7ZXuVQ/xyx0HKbopm/mu4PruvxEtrPTB0/IQcleU\nXhXUXqRjFXXePOrCaaubkqxNCn95B67aBLvmk8awxn3a4DocuQ0VIgWuT+gQwIWh\nJEgWBQKBgQDKD+2Yh1/rUzu15lbPH0JSpozUinuFjePieR/4n+5CtEUxWJ2f0WeK\ns4XWWf2qgUccjpiGju2UR840mgWROoZ8BfSTd5tg1F7bo0HMgu2hu0RIRpZcRhsA\nCd0GrJvf1t0QIdDCXAy+RpgU1SLSq4Q6Lomc0WA5C5nBw9RKEUOV9A==\n-----END RSA PRIVATE KEY-----\n";
const $fee1848bd04bd180$var$PUBLIC_KEY_PEM = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApoocpO3bbUF6o8eyJlQC\nfwLahEsunWdVF++yOEyKu4Lp1j0m2j/P7iHOtxBAkjdM2X2oW3qO1mR0sIFefqnm\n93g0q2nRuYEoS+W3o6X50wjOVm8fr/tLqELzy5BoET0AQl7Axp1DNsb0HNOBcoIB\nt+xVY4I+k6uXJJJMzbgvahAgSLZ9RW0Z0WT+dCHZpZUj0nLxNXIPdci65Bw6Iogn\nqXHP6AwKZXpT6jCzjzq9uyHxVcudqw6j0kQw48/A5A6AN5fIVy1cKnd0sKdqRX1N\nUqVoiOrO4jaDB1IdLD+YmRE/JjOHsWIMElYCPxKqnsNo6VCslGX/ziinArHhqRBr\nHwIDAQAB\n-----END PUBLIC KEY-----\n";
const $fee1848bd04bd180$export$67b9d010cfffa653 = ({ publicKey: publicKey, privateKey: privateKey, jwksOrigin: jwksOrigin })=>{
const cert = (0, ($parcel$interopDefault($7Izd7$nodeforge))).pki.createCertificate();
cert.publicKey = publicKey;
cert.serialNumber = '123';
const attrs = [
{
name: 'commonName',
value: `${jwksOrigin}`
}
];
cert.validity.notBefore = new Date();
cert.validity.notAfter = new Date();
cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1);
cert.setSubject(attrs);
cert.sign(privateKey, (0, ($parcel$interopDefault($7Izd7$nodeforge))).md.sha256.create());
return (0, ($parcel$interopDefault($7Izd7$nodeforge))).pki.certificateToPem(cert);
};
const $fee1848bd04bd180$var$getCertThumbprint = (certificate)=>{
const shasum = (0, $7Izd7$nodecrypto.createHash)('sha1');
const der = Buffer.from(certificate).toString('binary');
shasum.update(der);
return shasum.digest('base64');
};
const $fee1848bd04bd180$export$ee715dcb214d41eb = ({ privateKey: privateKey, publicKey: publicKey, jwksOrigin: jwksOrigin })=>{
const helperKey = new (0, ($parcel$interopDefault($7Izd7$nodersa)))();
helperKey.importKey((0, ($parcel$interopDefault($7Izd7$nodeforge))).pki.privateKeyToPem(privateKey));
const { n: modulus, e: exponent } = helperKey.exportKey('components');
const certPem = $fee1848bd04bd180$export$67b9d010cfffa653({
jwksOrigin: jwksOrigin,
privateKey: privateKey,
publicKey: publicKey
});
const certDer = (0, ($parcel$interopDefault($7Izd7$nodeforge))).util.encode64((0, ($parcel$interopDefault($7Izd7$nodeforge))).asn1.toDer((0, ($parcel$interopDefault($7Izd7$nodeforge))).pki.certificateToAsn1((0, ($parcel$interopDefault($7Izd7$nodeforge))).pki.certificateFromPem(certPem))).getBytes());
const thumbprint = $7Izd7$base64url.encode($fee1848bd04bd180$var$getCertThumbprint(certDer));
return {
keys: [
{
alg: 'RS256',
e: Buffer.isBuffer(exponent) ? exponent.toString() : $fee1848bd04bd180$var$bnToB64(String(exponent)),
kid: thumbprint,
kty: 'RSA',
n: modulus.toString('base64'),
use: 'sig',
x5c: [
certDer
],
x5t: thumbprint
}
]
};
};
const $fee1848bd04bd180$export$dfe45055eb4a3f83 = ()=>{
const privateKey = (0, ($parcel$interopDefault($7Izd7$nodeforge))).pki.privateKeyFromPem($fee1848bd04bd180$var$PRIVATE_KEY_PEM);
const publicKey = (0, ($parcel$interopDefault($7Izd7$nodeforge))).pki.publicKeyFromPem($fee1848bd04bd180$var$PUBLIC_KEY_PEM);
return {
privateKey: privateKey,
publicKey: publicKey
};
};
const $fee1848bd04bd180$export$1d452baa218acb3 = (privateKey, jwtPayload, kid)=>(0, ($parcel$interopDefault($7Izd7$jsonwebtoken))).sign(jwtPayload, (0, ($parcel$interopDefault($7Izd7$nodeforge))).pki.privateKeyToPem(privateKey), {
header: {
kid: kid,
alg: 'RS256'
}
});
// Below taken from https://coolaj86.com/articles/bigints-and-base64-in-javascript/
// Binary string to ASCII (base64)
function $fee1848bd04bd180$var$btoa(bin) {
return Buffer.from(bin, 'binary').toString('base64');
}
function $fee1848bd04bd180$var$bnToB64(bn) {
let hex = BigInt(bn).toString(16);
if (hex.length % 2) hex = `0${hex}`;
const bin = [];
let i = 0;
let d;
let b;
while(i < hex.length){
d = Number.parseInt(hex.slice(i, i + 2), 16);
b = String.fromCharCode(d);
bin.push(b);
i += 2;
}
return $fee1848bd04bd180$var$btoa(bin.join(''));
}
const $a82e61ab81c9e25c$export$17c94918db2c5155 = (jwksBase, jwksPath = '/.well-known/jwks.json')=>{
const keypair = (0, $fee1848bd04bd180$export$dfe45055eb4a3f83)();
const JWKS = (0, $fee1848bd04bd180$export$ee715dcb214d41eb)({
...keypair,
jwksOrigin: jwksBase
});
const handler = (0, $7Izd7$msw.http).get(new URL(jwksPath, jwksBase).href, ()=>(0, $7Izd7$msw.HttpResponse).json(JWKS));
const kid = ()=>JWKS.keys[0].kid;
let server;
const stop = ()=>{
server?.close();
server = undefined;
};
const start = ()=>{
if (server) throw new Error('JWKSMock is already started');
server = (0, $7Izd7$mswnode.setupServer)(handler);
server.listen({
onUnhandledRequest: 'bypass'
});
return ()=>stop();
};
const token = (token = {})=>(0, $fee1848bd04bd180$export$1d452baa218acb3)(keypair.privateKey, token, kid());
return {
start: start,
stop: /**
* @deprecated Use the thunk returned by `start` instead.
*/ stop,
kid: kid,
token: token,
mswHandler: handler
};
};
var /**
* @deprecated Use the named export instead
*/ $a82e61ab81c9e25c$export$2e2bcd8739ae039 = $a82e61ab81c9e25c$export$17c94918db2c5155;
//# sourceMappingURL=main.js.map