Auto commit: 2026-03-24 13:04
This commit is contained in:
79
src/routes/jwks.ts
Normal file
79
src/routes/jwks.ts
Normal file
@@ -0,0 +1,79 @@
|
||||
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',
|
||||
alias: 'gen',
|
||||
description: '生成 JWKS 密钥对',
|
||||
metadata: {
|
||||
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: {
|
||||
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)
|
||||
Reference in New Issue
Block a user