# 统一认证平台 (UAP) ## 1. 项目简介 统一认证平台 (Unified Authentication Platform, UAP) 是一个企业级的身份管理系统,旨在解决多应用间的账号统一、认证标准化及新老系统融合问题。 **核心能力:** - **多协议支持**:同时支持现代 OIDC (OpenID Connect) 协议和传统 API Ticket 认证。 - **账号中心**:以手机号为核心标识,支持密码登录和短信验证码登录。 - **账号映射**:解决老旧系统账号体系不一致问题,支持将统一手机号映射为特定系统的用户名、邮箱等。 - **安全集成**:内置图形验证码、短信验证码、操作审计、Webhook 通知等安全机制。 - **开箱即用**:提供完整的前后端界面和 Docker 容器化部署方案。 --- ## 2. 技术栈 ### 后端 (Backend) - **核心框架**: [FastAPI](https://fastapi.tiangolo.com/) (Python 3.10+) - 高性能异步 Web 框架。 - **数据库 ORM**: [SQLAlchemy](https://www.sqlalchemy.org/) (2.0+) - 强大的 ORM 工具。 - **数据验证**: [Pydantic](https://docs.pydantic.dev/) (2.0+) - 数据解析与验证。 - **认证引擎**: [Ory Hydra](https://www.ory.sh/hydra/) - 经过认证的 OAuth2/OIDC 服务器。 - **缓存/消息**: Redis - 用于验证码存储、Session 管理和任务队列。 - **验证码**: `captcha` + `Pillow` - 本地生成图形验证码。 - **短信服务**: 阿里云 SMS (可扩展 Mock 模式)。 - **任务调度**: FastAPI BackgroundTasks (轻量级异步任务)。 - **数据处理**: Pandas - 用于 Excel 数据的导入导出处理。 ### 前端 (Frontend) - **核心框架**: [Vue 3](https://vuejs.org/) (Composition API)。 - **语言**: TypeScript。 - **构建工具**: [Vite](https://vitejs.dev/) - 极速开发环境。 - **UI 组件库**: [Element Plus](https://element-plus.org/) - 企业级后台组件库。 - **状态管理**: Pinia。 - **网络请求**: Axios。 ### 基础设施 (Infrastructure) - **容器化**: Docker & Docker Compose。 - **Web 服务器**: Nginx (反向代理与静态资源服务)。 - **应用服务器**: Uvicorn (ASGI)。 - **数据库**: MySQL 8.0。 --- ## 3. 项目结构与文件说明 ### 3.1 目录概览 ```text Unified_Authentication_Platform/ ├── sql/ # 数据库迁移脚本 (Flyway) ├── backend/ # 后端项目 (FastAPI) │ ├── app/ # 应用源码 │ │ ├── api/v1/ # API 接口层 │ │ │ ├── endpoints/ # 具体业务接口实现 │ │ │ │ ├── apps.py # 应用管理 (增删改查, Secret重置) │ │ │ │ ├── auth.py # 平台登录认证 (JWT) │ │ │ │ ├── backup.py # 数据备份与恢复接口 │ │ │ │ ├── login_logs.py # 登录日志查询 │ │ │ │ ├── logs.py # 操作审计日志查询 (DB) │ │ │ │ ├── oidc.py # OIDC 协议集成 (Login/Consent Provider) │ │ │ │ ├── open_api.py # 开放接口 (短信发送, 改密) - 需签名 │ │ │ │ ├── simple_auth.py # 简易 Ticket 认证 (登录, 验证, 换票) │ │ │ │ ├── system_logs.py # 系统运行日志 (文件流, WebSocket实时) │ │ │ │ ├── users.py # 用户管理 (管理员用) │ │ │ │ └── utils.py # 通用工具 (验证码图片生成) │ │ │ ├── api.py # 路由注册汇总 │ │ │ └── deps.py # 依赖注入 (DB Session, Current User, Token) │ │ ├── core/ # 核心配置 │ │ │ ├── config.py # 环境变量加载 (.env)与全局配置 │ │ │ ├── security.py # 密码哈希, JWT 生成与校验 │ │ │ ├── database.py # SQLAlchemy 引擎与 SessionLocal │ │ │ ├── scheduler.py # 任务调度配置 (APScheduler/BackgroundTasks) │ │ │ └── hydra_config.py # Ory Hydra 客户端配置 │ │ ├── models/ # SQLAlchemy 数据模型 (MySQL Tables) │ │ │ ├── user.py # 用户表 (Users) │ │ │ ├── application.py # 应用表 (Applications) │ │ │ ├── mapping.py # 账号映射表 (AppUserMappings) │ │ │ ├── backup.py # 备份记录表 │ │ │ ├── login_log.py # 登录日志表 │ │ │ └── operation_log.py# 操作日志表 │ │ ├── schemas/ # Pydantic 数据模型 (Request/Response Validation) │ │ │ ├── user.py # 用户相关 Schema │ │ │ ├── token.py # Token 响应 Schema │ │ │ ├── application.py # 应用管理 Schema │ │ │ ├── mapping.py # 映射导入/查询 Schema │ │ │ ├── simple_auth.py # 简易认证参数 Schema │ │ │ ├── backup.py # 备份相关 Schema │ │ │ ├── login_log.py # 登录日志 Schema │ │ │ └── operation_log.py# 操作日志 Schema │ │ ├── services/ # 业务逻辑服务层 (解耦 Controller 与 Logic) │ │ │ ├── backup_service.py # 备份逻辑 (Zip打包, SQL导出) │ │ │ ├── captcha_service.py # 验证码生成与 Redis 校验 │ │ │ ├── hydra_service.py # Hydra Admin API 封装 │ │ │ ├── mapping_service.py # Excel 解析与批量导入逻辑 │ │ │ ├── signature_service.py# API 签名算法实现 │ │ │ ├── sms_service.py # 短信发送 (阿里云/Mock) │ │ │ ├── webhook_service.py # 变更通知推送逻辑 │ │ │ ├── ticket_service.py # Ticket 生成与验证逻辑 │ │ │ ├── log_service.py # 操作日志记录服务 │ │ │ └── login_log_service.py# 登录日志记录服务 │ │ └── main.py # FastAPI APP 入口, 中间件配置, 异常处理 │ ├── backups/ # 自动生成的数据库备份文件存储目录 │ ├── logs/ # 后端运行日志目录 │ ├── scripts/ # 维护脚本 (如初始化管理员) │ ├── Dockerfile # 后端容器构建定义 │ └── requirements.txt # Python 依赖包列表 │ ├── frontend/ # 前端项目 (Vue 3 + TS) │ ├── public/ # 静态资源 (Logo, Favicon) │ ├── src/ │ │ ├── api/ # 后端接口封装 (Axios) │ │ │ ├── apps.ts # 应用管理接口 │ │ │ ├── users.ts # 用户管理接口 │ │ │ ├── oidc.ts # OIDC 相关接口 │ │ │ ├── public.ts # 公开接口 (验证码, 短信, 注册, 找回密码) │ │ │ ├── mapping.ts # 映射管理接口 │ │ │ ├── backup.ts # 备份管理接口 │ │ │ ├── logs.ts # 操作日志接口 │ │ │ └── login_logs.ts # 登录日志接口 │ │ ├── components/ # 公共组件 │ │ │ └── PlatformIcon.vue # 平台图标组件 │ │ ├── data/ # 静态数据 (如更新日志) │ │ ├── router/ # 路由定义 (Vue Router) │ │ ├── store/ # 状态管理 (Pinia) │ │ │ └── auth.ts # 用户登录状态, 权限控制 │ │ ├── utils/ # 前端工具库 │ │ │ ├── request.ts # Axios 拦截器 (Token 注入, 错误处理) │ │ │ └── color.ts # 颜色生成工具 │ │ ├── views/ # 页面视图组件 │ │ │ ├── admin/ # 管理员专区 │ │ │ │ ├── maintenance/ # 运维管理 │ │ │ │ │ ├── DataBackup.vue # 数据备份与恢复 │ │ │ │ │ ├── LoginLogs.vue # 登录日志审计 │ │ │ │ │ ├── SystemLogs.vue # 系统运行日志 │ │ │ │ │ └── DataRestore.vue # 数据恢复弹窗 │ │ │ │ └── UserList.vue # 全局用户管理 │ │ │ ├── apps/ # 应用相关 │ │ │ │ ├── AppList.vue # 应用列表管理 │ │ │ │ └── MappingImport.vue # 账号映射导入向导 │ │ │ ├── Login.vue # 统一登录页 │ │ │ ├── Register.vue # 用户注册页 │ │ │ ├── Dashboard.vue # 用户/管理员仪表盘 │ │ │ ├── Consent.vue # OIDC 授权确认页 │ │ │ ├── PlatformLaunchpad.vue # 应用启动台 │ │ │ ├── MyMappings.vue # 我的账号映射 │ │ │ ├── ResetPassword.vue # 重置密码页 │ │ │ ├── Changelog.vue # 更新日志 │ │ │ ├── Help.vue # 帮助中心 │ │ │ └── SetupAdmin.vue # 初始化管理员页 │ │ ├── App.vue # 根组件 │ │ └── main.ts # 入口文件 (挂载 Vue, Pinia, Router) │ ├── nginx.conf # 前端 Nginx 配置 (反向代理, Gzip) │ ├── Dockerfile # 前端容器构建 (Multi-stage build) │ ├── package.json # Node.js 依赖与脚本 │ └── vite.config.ts # Vite 构建配置 │ ├── docker-compose.yml # 容器编排 (Backend, Frontend, MySQL, Redis, Hydra) └── .env # 环境变量配置文件 (不入库) ``` --- ## 4. 核心模块说明 ### 4.1 认证模块 (Auth) - **OIDC 集成**: - 集成 Ory Hydra,实现完整的 Authorization Code Flow。 - 提供自定义的 Login Provider (`/auth/login`) 和 Consent Provider (`/auth/consent`) 页面及接口。 - 支持 `openid`, `offline`, `profile` scopes。 - **简易认证 (Simple Auth)**: - 为不支持 OIDC 的老旧系统提供基于 Ticket 的认证机制。 - 流程:登录 -> 获取 Ticket -> 重定向 -> 验签换取用户信息。 - **安全机制**: - 图形验证码:防止暴力破解。 - 短信验证码:用于敏感操作(注册、重置密码)。 - 签名校验:开放 API (`/api/v1/open/*`) 强制要求 HMAC-SHA256 签名。 ### 4.2 应用管理 (Applications) - **应用注册**: 管理员可创建应用,分配 `App ID` 和 `App Secret`。 - **账号映射**: - 定义应用特定的账号字段(如 `mapped_key`)。 - 支持 Excel 批量导入映射关系。 - 支持通过 Webhook 实时推送映射变更。 ### 4.3 运维管理 - **日志审计**: - 登录日志 (`LoginLogs`):记录所有登录尝试及结果。 - 操作日志 (`SystemLogs`):记录管理员的关键操作。 - Webhook 日志:记录对下游系统的推送记录及响应。 - **数据备份**: 支持数据库的备份与恢复功能。 --- ## 5. 环境配置 (.env) 项目配置主要通过环境变量管理。虽然开发环境有默认值,但生产环境建议通过 `.env` 文件覆盖: | 变量名 | 说明 | 默认值/示例 | | :--- | :--- | :--- | | `MYSQL_SERVER` | MySQL 地址 | `localhost` | | `MYSQL_USER` | MySQL 用户名 | `root` | | `MYSQL_PASSWORD` | MySQL 密码 | `secret` | | `MYSQL_DB` | 数据库名 | `uap_db` | | `REDIS_HOST` | Redis 地址 | `localhost` | | `SECRET_KEY` | JWT/加密密钥 | `change_me_...` | | `SMS_PROVIDER` | 短信服务商 | `aliyun` 或 `mock` | | `ALIYUN_ACCESS_KEY_ID` | 阿里云 AK | - | | `ALIYUN_ACCESS_KEY_SECRET` | 阿里云 SK | - | --- ## 6. 安装与运行 ### 6.1 容器化部署 (推荐) 本项目支持一键启动: ```bash # 构建并启动所有服务 docker-compose up -d --build ``` 启动后可访问: - **前端页面**: `http://localhost:5173` (开发) 或 `http://localhost` (Nginx) - **后端 API 文档**: `http://localhost:8000/docs` - **Ory Hydra**: `http://localhost:4444` ### 6.2 本地开发运行 **后端**: ```bash cd backend # 创建虚拟环境 python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate # 安装依赖 pip install -r requirements.txt # 启动服务 uvicorn app.main:app --reload ``` **前端**: ```bash cd frontend # 安装依赖 npm install # 启动开发服务器 npm run dev ``` ### 6.3 数据库运维 (自动升级与恢复) 本项目集成了 **Flyway** 和 **Backup Sidecar**,实现了企业级的数据库运维能力。 #### 1. 自动升级数据库 (Flyway) - **原理**: `db-migration` 容器启动时会自动比对 `sql/` 目录下的脚本与数据库状态,自动执行增量更新。 - **操作步骤**: 1. 在项目根目录的 `sql/` 文件夹中创建 SQL 文件。 2. 命名需遵循 Flyway 规范:`V<版本号>__<描述>.sql` (**注意是双下划线**)。 - 示例: `sql/V1__init_schema.sql`, `sql/V2__add_phone_field.sql` 3. 执行 `docker-compose up -d`。容器会自动检测并应用新的 SQL 变更。 #### 2. 灾难恢复 (Disaster Recovery) - **自动备份**: `db-backup` 容器每天凌晨 3:00 自动将数据库备份至 `backups/` 目录 (保留7天)。 - **手动恢复步骤**: 假设需要从 `backups/uap_db_xxxx.sql.gz` 恢复数据: ```bash # 1. 停止应用服务,防止写入 docker-compose stop # 2. 仅启动数据库 docker-compose up -d mysql # 3. 执行恢复 (使用 Docker 临时容器执行导入,无需本地安装 MySQL 客户端) # 注意:替换下方文件名 docker run --rm -i \ --network container:uap_mysql \ mysql:8.0 \ sh -c 'exec mysql -h mysql -u root -proot_password uap_db' < <(gzip -dc ./backups/uap_db_xxxx.sql.gz) # 4. 恢复完成后重启所有服务 docker-compose restart ``` --- ## 7. 常见问题 (FAQ) - **Q: 默认管理员账号是什么?** - A: 如果执行了初始化脚本,通常为手机号 `13800000001`,密码 `admin`。 - **Q: 验证码图片加载失败?** - A: 检查 Redis 连接是否正常,以及字体文件是否存在(通常由 Pillow 自带)。 - **Q: 短信发送失败?** - A: 检查 `SMS_PROVIDER` 配置。开发环境可设置为 `mock`,验证码将直接打印在后端日志中。 --- _最后更新时间: 2026-01-09_