From ab0ba939d43dfaffcfe4110f3fa3972b5bea809d Mon Sep 17 00:00:00 2001 From: abearxiong Date: Tue, 10 Feb 2026 22:54:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20JWKS=20=E7=94=9F=E6=88=90?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=8C=E6=94=AF=E6=8C=81=E5=AF=86=E9=92=A5?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=9A=84=E5=88=9B=E5=BB=BA=E4=B8=8E=E4=BF=9D?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/jwks/index.ts | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/modules/jwks/index.ts diff --git a/src/modules/jwks/index.ts b/src/modules/jwks/index.ts new file mode 100644 index 0000000..d24da36 --- /dev/null +++ b/src/modules/jwks/index.ts @@ -0,0 +1,31 @@ +import { generate } from '@kevisual/auth' +import fs from 'node:fs'; +import path from 'node:path'; +export const getPath = async (dir: string) => { + const JWKS_PATH = path.join(dir, 'jwks.json'); + const PRIVATE_JWK_PATH = path.join(dir, 'privateKey.json'); + const PRIVATE_KEY_PATH = path.join(dir, 'privateKey.txt'); + const PUBLIC_KEY_PATH = path.join(dir, 'publicKey.txt'); + return { + JWKS_PATH, + PRIVATE_JWK_PATH, + PRIVATE_KEY_PATH, + PUBLIC_KEY_PATH, + } +} + + +export const jwksGenerate = async (opts: { dir: string }) => { + const dir = path.isAbsolute(opts.dir) ? opts.dir : path.join(process.cwd(), opts.dir); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + const { JWKS_PATH, PRIVATE_JWK_PATH, PRIVATE_KEY_PATH, PUBLIC_KEY_PATH } = await getPath(dir); + const { jwks, privateJWK, privatePEM, publicPEM } = await generate(); + fs.writeFileSync(PUBLIC_KEY_PATH, publicPEM); + fs.writeFileSync(PRIVATE_KEY_PATH, privatePEM); + fs.writeFileSync(PRIVATE_JWK_PATH, JSON.stringify(privateJWK, null, 2)); + fs.writeFileSync(JWKS_PATH, JSON.stringify(jwks, null, 2)); + console.log(`Keys have been saved to directory: ${dir}`); +} +