# OAuth 动态客户端注册实现总结 ## 概述 成功为 MCPHub 的 OAuth 2.0 授权服务器添加了 RFC 7591 标准的动态客户端注册功能。此功能允许 OAuth 客户端在运行时自动注册,无需管理员手动配置。 ## 实现的功能 ### 1. 核心端点 #### POST /oauth/register - 注册新客户端 - 公开端点,支持动态客户端注册 - 自动生成 client_id 和可选的 client_secret - 返回 registration_access_token 用于后续管理 - 支持 PKCE 流程(token_endpoint_auth_method: "none") #### GET /oauth/register/:clientId - 读取客户端配置 - 需要 registration_access_token 认证 - 返回完整的客户端元数据 #### PUT /oauth/register/:clientId - 更新客户端配置 - 需要 registration_access_token 认证 - 支持更新 redirect_uris、scopes、metadata 等 #### DELETE /oauth/register/:clientId - 删除客户端注册 - 需要 registration_access_token 认证 - 删除客户端并清理相关 tokens ### 2. 配置选项 在 `mcp_settings.json` 中添加: ```json { "systemConfig": { "oauthServer": { "enabled": true, "dynamicRegistration": { "enabled": true, "allowedGrantTypes": ["authorization_code", "refresh_token"], "requiresAuthentication": false } } } } ``` ### 3. 客户端元数据支持 实现了 RFC 7591 定义的完整客户端元数据: - `application_type`: "web" 或 "native" - `response_types`: OAuth 响应类型数组 - `token_endpoint_auth_method`: 认证方法 - `contacts`: 联系邮箱数组 - `logo_uri`: 客户端 logo URL - `client_uri`: 客户端主页 URL - `policy_uri`: 隐私政策 URL - `tos_uri`: 服务条款 URL - `jwks_uri`: JSON Web Key Set URL - `jwks`: 内联 JSON Web Key Set ### 4. 安全特性 - **Registration Access Token**: 每个注册的客户端获得唯一的访问令牌 - **Token 过期**: Registration tokens 30 天后过期 - **HTTPS 验证**: Redirect URIs 必须使用 HTTPS(localhost 除外) - **Scope 验证**: 只允许配置中定义的 scopes - **Grant Type 限制**: 只允许配置中定义的 grant types ## 文件变更 ### 新增文件 1. `src/controllers/oauthDynamicRegistrationController.ts` - 动态注册控制器 2. `examples/oauth-dynamic-registration-config.json` - 配置示例 ### 修改文件 1. `src/types/index.ts` - 添加元数据字段到 IOAuthClient 和 OAuthServerConfig 2. `src/routes/index.ts` - 注册新的动态注册端点 3. `src/controllers/oauthServerController.ts` - 元数据端点包含 registration_endpoint 4. `docs/oauth-server.md` - 添加完整的动态注册文档 ## 使用示例 ### 注册新客户端 ```bash curl -X POST http://localhost:3000/oauth/register \ -H "Content-Type: application/json" \ -d '{ "client_name": "My Application", "redirect_uris": ["https://example.com/callback"], "grant_types": ["authorization_code", "refresh_token"], "response_types": ["code"], "scope": "read write", "token_endpoint_auth_method": "none", "logo_uri": "https://example.com/logo.png", "client_uri": "https://example.com", "contacts": ["admin@example.com"] }' ``` 响应: ```json { "client_id": "a1b2c3d4e5f6g7h8", "client_name": "My Application", "redirect_uris": ["https://example.com/callback"], "registration_access_token": "reg_token_xyz123", "registration_client_uri": "http://localhost:3000/oauth/register/a1b2c3d4e5f6g7h8", "client_id_issued_at": 1699200000 } ``` ### 读取客户端配置 ```bash curl http://localhost:3000/oauth/register/CLIENT_ID \ -H "Authorization: Bearer REGISTRATION_ACCESS_TOKEN" ``` ### 更新客户端 ```bash curl -X PUT http://localhost:3000/oauth/register/CLIENT_ID \ -H "Authorization: Bearer REGISTRATION_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "client_name": "Updated Name", "redirect_uris": ["https://example.com/callback", "https://example.com/callback2"] }' ``` ### 删除客户端 ```bash curl -X DELETE http://localhost:3000/oauth/register/CLIENT_ID \ -H "Authorization: Bearer REGISTRATION_ACCESS_TOKEN" ``` ## 测试结果 ✅ 所有 180 个测试通过 ✅ TypeScript 编译成功 ✅ 代码覆盖率维持在合理水平 ✅ 与现有功能完全兼容 ## RFC 合规性 完全遵循以下 RFC 标准: - **RFC 7591**: OAuth 2.0 Dynamic Client Registration Protocol - **RFC 8414**: OAuth 2.0 Authorization Server Metadata - **RFC 7636**: Proof Key for Code Exchange (PKCE) - **RFC 9728**: OAuth 2.0 Protected Resource Metadata ## 下一步建议 1. **持久化存储**: 当前 registration tokens 存储在内存中,生产环境应使用数据库 2. **速率限制**: 添加注册端点的速率限制以防止滥用 3. **客户端证明**: 考虑添加软件声明(software_statement)支持 4. **审计日志**: 记录所有注册、更新和删除操作 5. **通知机制**: 在客户端注册时通知管理员(可选) ## 兼容性 - 与 ChatGPT Web 完全兼容 - 支持所有标准 OAuth 2.0 客户端库 - 向后兼容现有的手动客户端配置方式