Files
cli/src/routes/jwks.ts

81 lines
2.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)