import { app } from '../app.ts'; import { z } from 'zod'; 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, } } app.route({ path: 'jwks', key: 'generate', description: '生成 JWKS 密钥对', metadata: { middleware: ['auth'], args: { dir: z.string().optional().describe('指定保存目录'), } } }).define(async (ctx) => { const dir = ctx.args.dir || 'jwt'; const absDir = path.isAbsolute(dir) ? dir : path.join(process.cwd(), dir); if (!fs.existsSync(absDir)) { fs.mkdirSync(absDir, { recursive: true }); } const { JWKS_PATH, PRIVATE_JWK_PATH, PRIVATE_KEY_PATH, PUBLIC_KEY_PATH } = await getPath(absDir); 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: ${absDir}`); }).addTo(app) app.route({ path: 'jwks', key: 'get', description: '获取 JWKS 内容', metadata: { middleware: ['auth'], args: { dir: z.string().optional().describe('指定 JWKS 所在目录'), type: z.string().optional().describe('指定获取类型,jwks 或 privateJWK'), } } }).define(async (ctx) => { const dir = ctx.args.dir || 'jwt'; const absDir = path.isAbsolute(dir) ? dir : path.join(process.cwd(), dir); const { JWKS_PATH, PRIVATE_JWK_PATH } = await getPath(absDir); const type = ctx.args.type || 'jwks'; if (type !== 'jwks') { if (!fs.existsSync(PRIVATE_JWK_PATH)) { console.error(`Private JWK file not found in directory: ${absDir}`); return; } const privateJWKContent = fs.readFileSync(PRIVATE_JWK_PATH, 'utf-8'); console.log('Private JWK:\n'); console.log(privateJWKContent); return; } if (!fs.existsSync(JWKS_PATH)) { console.error(`JWKS file not found in directory: ${absDir}`); return; } const jwksContent = fs.readFileSync(JWKS_PATH, 'utf-8'); console.log('PublicJWKS:\n'); console.log(jwksContent); }).addTo(app)