@tsed/jwks 8.0.1 → 8.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -3
- package/src/__mocks__/keys/enc.rsa.prv.pem +51 -0
- package/src/__mocks__/keys/enc.rsa.pub.pem +14 -0
- package/src/__mocks__/keys/sig.rsa.prv.pem +51 -0
- package/src/__mocks__/keys/sig.rsa.pub.pem +14 -0
- package/src/getJwks.spec.ts +59 -0
- package/src/getJwks.ts +47 -0
- package/src/index.ts +3 -0
package/package.json
CHANGED
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
"name": "@tsed/jwks",
|
|
3
3
|
"description": "Utils to generate jwks pair keys",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "8.0.
|
|
5
|
+
"version": "8.0.3",
|
|
6
6
|
"source": "./src/index.ts",
|
|
7
7
|
"main": "./lib/esm/index.js",
|
|
8
8
|
"module": "./lib/esm/index.js",
|
|
9
9
|
"typings": "./lib/types/index.d.ts",
|
|
10
10
|
"exports": {
|
|
11
11
|
".": {
|
|
12
|
+
"@tsed/source": "./src/index.ts",
|
|
12
13
|
"types": "./lib/types/index.d.ts",
|
|
13
14
|
"import": "./lib/esm/index.js",
|
|
14
15
|
"default": "./lib/esm/index.js"
|
|
@@ -27,8 +28,8 @@
|
|
|
27
28
|
"tslib": "2.7.0"
|
|
28
29
|
},
|
|
29
30
|
"devDependencies": {
|
|
30
|
-
"@tsed/barrels": "8.0.
|
|
31
|
-
"@tsed/typescript": "8.0.
|
|
31
|
+
"@tsed/barrels": "8.0.3",
|
|
32
|
+
"@tsed/typescript": "8.0.3",
|
|
32
33
|
"eslint": "9.12.0",
|
|
33
34
|
"typescript": "5.4.5",
|
|
34
35
|
"vitest": "2.1.2"
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
|
2
|
+
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
|
|
51
|
+
-----END RSA PRIVATE KEY-----
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
-----BEGIN PUBLIC KEY-----
|
|
2
|
+
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAooP/p2isfqsJH+OAPT3l
|
|
3
|
+
vCJOFCxgscE0SC8zj0sWs/r/N5zm7UTaU0PgH6NLURkNSiAqDfzKFfeV9QxkzYRl
|
|
4
|
+
HJ+JFt32MC+ypk+93gOYJOMOVk4JGHi5U77D/5tD3mjWe6bQM6k8wKgp44+sboq/
|
|
5
|
+
FDauA9dM+Mw0LSeueGBo9TigQ7U0vTKfGYRWZv70X6lEePdeej5aoc3IhU5bX81f
|
|
6
|
+
jvKKutwyoza4ovXPJuOwYJOhAsMmkZjWbi8qjXCFuz1arVxsb2qNOjmQlk+Yoleg
|
|
7
|
+
j16Wfcs+W83TTU7+Heijl3YVHi+XLPstemGiPGJhAikQWCv9udYFqlZjhyX22iSt
|
|
8
|
+
qPYBDkqi0lVy0bUVs0pmD90BB46kXmvHpxiwh+oDPtGZzt0lzcjmVP1HXF2X+c9i
|
|
9
|
+
2xLsKvibbizqqQ5G7okPs5MO+Jvww0/6++T4ATM5MzxIIN1cWH/uq7SKoP/Fsphe
|
|
10
|
+
6GeeJrtD/Ww2T30ZQVzoSYMZE/PvH6wVegb0IrWhXH5tklFDYkJXyAmLPAReMXuZ
|
|
11
|
+
MTg7EXaMU2ACGShXp7bN6gxrkcVaA4TnOQgEALCI1rusORUyf8wOYIW5iLdXcnaY
|
|
12
|
+
5GZgH2OymyCZ6AzxsAc4TpwDrGNHuA5oitucfqLicUAAoGItn9rJOTQ6M2HkyqS+
|
|
13
|
+
TeKwmmz2mb1oslGfSCJ9y4UCAwEAAQ==
|
|
14
|
+
-----END PUBLIC KEY-----
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
|
2
|
+
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
|
|
51
|
+
-----END RSA PRIVATE KEY-----
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
-----BEGIN PUBLIC KEY-----
|
|
2
|
+
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArQ+VYeRDY+Y6gPMCSLWL
|
|
3
|
+
zWB2CSvAIxmE1VN/IRJlvjheATFgWQT4qcsFSK7EQ1frz+DhjmCUQcFQ53ubDKz+
|
|
4
|
+
f4zHVEeH9+8H2bw2DZ0uUss3LDnA3ryZ9J1Qhxp7bcsyKQOmCDnqMhLd8Sp0B8v1
|
|
5
|
+
vKmCvXAd4NOz1BhDkCWI7LhZjEzGRqy3mPHp2JKhyM4DPa5FLlpQnWOAmy+W39gm
|
|
6
|
+
Nwfpnz6zpIBrkKglWEpHCdT59fxsyslz3anxklGKMBGwUa3ZHiwN/VTkPU39K/p2
|
|
7
|
+
Xop5mtvO9rh87vImWbAE8w8nSPO7wmCTiBJY+bgG4KeXbB1NLAyEfaty2RXMh8va
|
|
8
|
+
CAlpT+FKxO6u1DGcrsvAmkOmHsGIIYtd3syxVhYkrFKZU1vhDJq1jER9JlKGnzCY
|
|
9
|
+
SrXINJ4iNEk5gIw8YJtAmJsj2gVYdLCJx4HUXv77WC+xDQ7MAYqIYF5fL2R+k+dp
|
|
10
|
+
aJs+Fyn76vf8yr2SDC4j442P+Evt78NYl5/sIOKS47GKNx7V+JIcA2TJVZyKTmeQ
|
|
11
|
+
QCpMhFuLJIJBxBF6S998oEgM4cPtZSOfugByu0rjf3CfQXl32Qc6dVXtOeIzZlzM
|
|
12
|
+
3dxOnvzVsiM9kiYp9d7uKFGkQXgyw7umI+VrWQIDwi7ppJIX6fuemJD9KxtA34Wa
|
|
13
|
+
e3qtm9ISXV7NeZIXt5d1+DcCAwEAAQ==
|
|
14
|
+
-----END PUBLIC KEY-----
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import {join} from "path";
|
|
3
|
+
|
|
4
|
+
import {generateJwks, getJwks} from "./getJwks.js";
|
|
5
|
+
|
|
6
|
+
const rootDir = join(import.meta.dirname, "__mocks__");
|
|
7
|
+
|
|
8
|
+
describe("GetJwks", () => {
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
fs.removeSync(join(rootDir, "generated", "keys.json"));
|
|
11
|
+
});
|
|
12
|
+
describe("generateJwks()", () => {
|
|
13
|
+
it("should generate Jwks keys without certificates", async () => {
|
|
14
|
+
const output = await generateJwks();
|
|
15
|
+
|
|
16
|
+
expect(output.keys.length).toEqual(3);
|
|
17
|
+
});
|
|
18
|
+
it("should generateJwks keys from certificates", async () => {
|
|
19
|
+
const output = await generateJwks({
|
|
20
|
+
certificates: [
|
|
21
|
+
{path: join(rootDir, "keys", "sig.rsa.pub.pem"), alg: "RS256", use: "sig", kid: "key-0"},
|
|
22
|
+
{path: join(rootDir, "keys", "sig.rsa.prv.pem"), alg: "RS256", use: "sig"},
|
|
23
|
+
{path: join(rootDir, "keys", "enc.rsa.pub.pem"), alg: "RS256", use: "enc", kid: "key-1"},
|
|
24
|
+
{path: join(rootDir, "keys", "enc.rsa.prv.pem"), alg: "RS256", use: "enc"}
|
|
25
|
+
] as never[]
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
expect(output).toEqual({
|
|
29
|
+
keys: [
|
|
30
|
+
{
|
|
31
|
+
alg: "RS256",
|
|
32
|
+
e: "AQAB",
|
|
33
|
+
kid: "key-0",
|
|
34
|
+
kty: "RSA",
|
|
35
|
+
n: "rQ-VYeRDY-Y6gPMCSLWLzWB2CSvAIxmE1VN_IRJlvjheATFgWQT4qcsFSK7EQ1frz-DhjmCUQcFQ53ubDKz-f4zHVEeH9-8H2bw2DZ0uUss3LDnA3ryZ9J1Qhxp7bcsyKQOmCDnqMhLd8Sp0B8v1vKmCvXAd4NOz1BhDkCWI7LhZjEzGRqy3mPHp2JKhyM4DPa5FLlpQnWOAmy-W39gmNwfpnz6zpIBrkKglWEpHCdT59fxsyslz3anxklGKMBGwUa3ZHiwN_VTkPU39K_p2Xop5mtvO9rh87vImWbAE8w8nSPO7wmCTiBJY-bgG4KeXbB1NLAyEfaty2RXMh8vaCAlpT-FKxO6u1DGcrsvAmkOmHsGIIYtd3syxVhYkrFKZU1vhDJq1jER9JlKGnzCYSrXINJ4iNEk5gIw8YJtAmJsj2gVYdLCJx4HUXv77WC-xDQ7MAYqIYF5fL2R-k-dpaJs-Fyn76vf8yr2SDC4j442P-Evt78NYl5_sIOKS47GKNx7V-JIcA2TJVZyKTmeQQCpMhFuLJIJBxBF6S998oEgM4cPtZSOfugByu0rjf3CfQXl32Qc6dVXtOeIzZlzM3dxOnvzVsiM9kiYp9d7uKFGkQXgyw7umI-VrWQIDwi7ppJIX6fuemJD9KxtA34Wae3qtm9ISXV7NeZIXt5d1-Dc",
|
|
36
|
+
use: "sig"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
alg: "RS256",
|
|
40
|
+
e: "AQAB",
|
|
41
|
+
kid: "key-1",
|
|
42
|
+
kty: "RSA",
|
|
43
|
+
n: "ooP_p2isfqsJH-OAPT3lvCJOFCxgscE0SC8zj0sWs_r_N5zm7UTaU0PgH6NLURkNSiAqDfzKFfeV9QxkzYRlHJ-JFt32MC-ypk-93gOYJOMOVk4JGHi5U77D_5tD3mjWe6bQM6k8wKgp44-sboq_FDauA9dM-Mw0LSeueGBo9TigQ7U0vTKfGYRWZv70X6lEePdeej5aoc3IhU5bX81fjvKKutwyoza4ovXPJuOwYJOhAsMmkZjWbi8qjXCFuz1arVxsb2qNOjmQlk-Yolegj16Wfcs-W83TTU7-Heijl3YVHi-XLPstemGiPGJhAikQWCv9udYFqlZjhyX22iStqPYBDkqi0lVy0bUVs0pmD90BB46kXmvHpxiwh-oDPtGZzt0lzcjmVP1HXF2X-c9i2xLsKvibbizqqQ5G7okPs5MO-Jvww0_6--T4ATM5MzxIIN1cWH_uq7SKoP_Fsphe6GeeJrtD_Ww2T30ZQVzoSYMZE_PvH6wVegb0IrWhXH5tklFDYkJXyAmLPAReMXuZMTg7EXaMU2ACGShXp7bN6gxrkcVaA4TnOQgEALCI1rusORUyf8wOYIW5iLdXcnaY5GZgH2OymyCZ6AzxsAc4TpwDrGNHuA5oitucfqLicUAAoGItn9rJOTQ6M2HkyqS-TeKwmmz2mb1oslGfSCJ9y4U",
|
|
44
|
+
use: "enc"
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe("getJwks()", () => {
|
|
51
|
+
it("should generate Jwks keys without certificates", () => {
|
|
52
|
+
const output = getJwks({
|
|
53
|
+
path: join(rootDir, "generated", "keys.json")
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
expect(output.keys.length).toEqual(3);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|
package/src/getJwks.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import {dirname} from "node:path";
|
|
2
|
+
|
|
3
|
+
import fs from "fs-extra";
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
import {JWK, JWKS, KeyParameters} from "jose2";
|
|
6
|
+
|
|
7
|
+
export interface JwksKeyParameters extends KeyParameters {
|
|
8
|
+
path: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface JwksOptions {
|
|
12
|
+
path: string;
|
|
13
|
+
certificates?: JwksKeyParameters[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function generateJwks(options: Partial<JwksOptions> = {}) {
|
|
17
|
+
const {certificates} = options;
|
|
18
|
+
const keystore = new JWKS.KeyStore();
|
|
19
|
+
|
|
20
|
+
if (certificates) {
|
|
21
|
+
certificates.forEach(({path, ...options}) => {
|
|
22
|
+
const content = fs.readFileSync(path, {encoding: "utf-8"});
|
|
23
|
+
const isPrivate = content.includes("PRIVATE KEY");
|
|
24
|
+
|
|
25
|
+
if (!isPrivate) {
|
|
26
|
+
keystore.add(JWK.asKey(content, options));
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
} else {
|
|
30
|
+
keystore.generateSync("RSA", 2048, {use: "sig"});
|
|
31
|
+
keystore.generateSync("EC", "P-256", {use: "sig", alg: "ES256"});
|
|
32
|
+
keystore.generateSync("OKP", "Ed25519", {use: "sig", alg: "EdDSA"});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return keystore.toJWKS(true);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function getJwks(options: JwksOptions) {
|
|
39
|
+
fs.ensureDirSync(dirname(options.path));
|
|
40
|
+
|
|
41
|
+
if (!fs.existsSync(options.path)) {
|
|
42
|
+
const keys = generateJwks(options);
|
|
43
|
+
fs.writeFileSync(options.path, JSON.stringify(keys, null, 2));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return JSON.parse(fs.readFileSync(options.path, {encoding: "utf-8"}));
|
|
47
|
+
}
|
package/src/index.ts
ADDED