- 后端:基于 node-oidc-provider 实现 OIDC Provider - 支持 authorization_code、refresh_token、client_credentials 授权类型 - Redis adapter 存储会话数据,Prisma adapter 存储持久化数据 - 客户端管理 CRUD API(创建、更新、删除、重新生成密钥) - 交互 API(登录、授权确认、中止) - 第一方应用自动跳过授权确认页面 - 使用 cuid2 生成客户端 ID - 前端:OIDC 客户端管理界面 - 客户端列表表格(支持分页、排序) - 创建/编辑弹窗(支持所有 OIDC 配置字段) - OIDC 交互页面(登录表单、授权确认表单) - 共享类型:添加 OIDC 相关 TypeScript 类型定义 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
import type { Adapter } from 'oidc-provider';
|
|
|
|
import { PrismaAdapter } from './prisma.adapter';
|
|
import { RedisAdapter } from './redis.adapter';
|
|
|
|
import { RedisService } from '@/common/redis/redis.service';
|
|
import { PrismaService } from '@/prisma/prisma.service';
|
|
|
|
|
|
// Prisma 存储的模型
|
|
const PRISMA_MODELS = ['Client', 'Grant', 'RefreshToken'];
|
|
|
|
// Redis 存储的模型
|
|
const REDIS_MODELS = [
|
|
'AuthorizationCode',
|
|
'AccessToken',
|
|
'Session',
|
|
'Interaction',
|
|
'DeviceCode',
|
|
'BackchannelAuthenticationRequest',
|
|
'RegistrationAccessToken',
|
|
'ReplayDetection',
|
|
'PushedAuthorizationRequest',
|
|
];
|
|
|
|
/**
|
|
* 创建混合适配器工厂
|
|
* 根据模型类型选择 Prisma 或 Redis 适配器
|
|
*/
|
|
export function createAdapterFactory(prisma: PrismaService, redis: RedisService) {
|
|
return (model: string): Adapter => {
|
|
if (PRISMA_MODELS.includes(model)) {
|
|
return new PrismaAdapter(prisma, model);
|
|
}
|
|
if (REDIS_MODELS.includes(model)) {
|
|
return new RedisAdapter(redis, model);
|
|
}
|
|
// 默认使用 Redis 适配器
|
|
return new RedisAdapter(redis, model);
|
|
};
|
|
}
|