跳到主要内容
xray.top

GinkgoID

GinkgoID 是一套易读、可运维、便于二次开发的 OpenID Connect Provider (OIDC OP)。

9/21/2025

GinkgoID — 自托管 OpenID Connect Provider

GinkgoID 是一套易读、可运维、便于二次开发的 OpenID Connect Provider (OIDC OP)。后台使用 Go + Gin + GORM 驱动,前端提供基于 Next.js 的用户/开发者控制台,并内置 Prometheus 指标、审计日志、密钥加密与轮换、动态客户端注册等生产必备能力。仓库目标是让团队可以在本地快速跑起来,稳步演进到上线环境。

功能概览

系统架构

Code
┌────────────┐   ┌───────────────┐
│ Next.js SPA│◀▶ │ REST / API    │  Gin 路由 + Handlers
└────┬───────┘   │  authorize    │
     │           └───────┬───────┘
     │ 静态资源           │
     ▼                   ▼
 ┌────────┐      ┌────────────────┐
 │ web/app│      │    Services    │ key/token/client/session 等
 └────────┘      └───────┬────────┘
                         │
          ┌──────────────┴──────────────┐
          ▼                             ▼
     MySQL (GORM)                 Redis (会话/票据)

目录速览

| 路径 | 说明 | | ---- | ---- | | cmd/server/ | 主服务入口,负责进程生命周期与 gin 路由注册 | | cmd/e2e/ | Go 实现的端到端自测脚本,用于 CI 或本地巡检 | | cmd/migrate-keys/ | 将 jwk_keys.private_key 从明文迁移到 AES-GCM 加密 | | internal/config/ | 配置定义与加载逻辑,含默认值与验证 | | internal/handlers/ | HTTP 层实现(OIDC 核心、控制台 API、模板页面) | | internal/services/ | 业务逻辑与存储操作封装(client/token/session 等) | | internal/storage/ | GORM 模型定义与自动迁移,MySQL/Redis 初始化 | | internal/metrics/ | Prometheus 指标定义与中间件 | | internal/middlewares/ | 请求日志、安全头、限流、Request ID 等 | | docs/ | OpenAPI 规范 (swagger.json/yaml)、密钥轮换说明 | | frontend/ | Next.js 控制台源代码(详情见 frontend/README.md) | | web/ | 渲染模板与打包后的静态资源(web/app 来自 frontend build) | | Makefile | 常用任务封装(run/build/fmt/lint/swagger/e2e 等) | | docker-compose.yml | 本地一键启动 MySQL + Redis + OP 服务 |

快速开始

依赖准备

本地运行(Go 服务)

Bash
# 复制示例配置并按需修改
cp config.example.yaml config.yaml

# 启动数据库(可选,亦可使用 docker-compose)
mysqld --defaults-file=...
redis-server

# 运行服务
GOENV=dev go run ./cmd/server
# 或
make run

验证:

Docker Compose 一键启动

Bash
docker compose up -d --build
# 停止并清理
docker compose down -v

Compose 会启动 MySQL、Redis、GinkgoID 三个容器。docker-compose.yml 顶部集中列出了可通过环境变量覆盖的镜像与端口配置,记得将本地 config.yaml(或 secrets)挂载到 CONFIG_PATH 指定位置以供服务读取。

前端开发模式

详见 frontend/README.md。快速提示:

Bash
cd frontend
pnpm install   # 或 npm install / yarn
pnpm dev       # Next.js 开发服务器,默认 3000 端口

开发期间 Go 服务仍然提供 API。构建后运行 pnpm build && pnpm postbuild,静态文件会同步到 web/app

配置说明

所有配置通过 config.yaml 加载,可被环境变量覆盖(自行扩展)。仓库附带 config.example.yaml,包含常用字段示例;复制为实际 config.yaml 后再结合环境变量/密钥管理替换敏感值。internal/config/config.go 提供默认值。以下是核心段落:

核心项

数据库与缓存

加密与安全

Token 与 Session

动态注册与限流

DPoP

详细字段及默认值请直接阅读 config.yamlinternal/config/config.go

存储层与迁移

建议:

密钥管理与安全

签名密钥

私钥加密

轮换流程

ACR / MFA

DPoP / Token 绑定

OIDC/OAuth2 端点

核心路由在 internal/handlers 注册:

所有 API 均带 Swagger 注释。更新 handler 注释后执行:

Bash
make swagger  # 生成 docs/swagger.json

前端控制台

更细的前端文档请看 frontend/README.md

观测与运维

测试与质量保障

开发工作流

  1. 创建或更新 handler/service 时补充 Swagger 注释与单元测试。
  2. 使用 make fmt / go fmt 规范代码,必要时运行 go vet
  3. 修改存储层结构时更新 internal/storage/migrate.go,避免直接手写 SQL 漏掉自动迁移。
  4. 前端改动需同步运行 pnpm build && pnpm postbuild,确保 web/app 中产物与服务器契合。
  5. 提交前跑一次 make ci + go test ./... + (可选)go run ./cmd/e2e

部署建议

备份与恢复

演练流程:恢复数据库 -> 启动服务 -> 执行 cmd/e2e -> 验证授权正常。

常见问题排查

附录:常用命令

Bash
# 运行服务(开发)
go run ./cmd/server

# 构建二进制
go build -o ginkgoid ./cmd/server

# 生成 OpenAPI 文档
make swagger

# 端到端巡检
make e2e

# Docker 镜像
docker build -t ginkgoid:latest .

# 清理构建产物与缓存
make clean

# 加密历史私钥
go run ./cmd/migrate-keys -confirm

# 生成随机 32 字节密钥
head -c 32 /dev/urandom | base64

欢迎提 Issue / PR。