Files
seclusion/apps/api/src/oidc/adapters/index.ts
charilezhou 90513e8278 feat: 实现完整的 OIDC Provider 功能
- 后端:基于 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>
2026-01-20 17:22:32 +08:00

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);
};
}