mirror of
https://github.com/samanhappy/mcphub.git
synced 2025-12-24 02:39:19 -05:00
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: samanhappy <2755122+samanhappy@users.noreply.github.com> Co-authored-by: samanhappy <samanhappy@gmail.com>
170 lines
5.0 KiB
Markdown
170 lines
5.0 KiB
Markdown
# 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 客户端库
|
||
- 向后兼容现有的手动客户端配置方式
|