Files
mcphub/docs/oauth-dynamic-registration-implementation.md
2025-11-21 13:25:02 +08:00

5.0 KiB
Raw Permalink Blame History

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 中添加:

{
  "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 必须使用 HTTPSlocalhost 除外)
  • 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 - 添加完整的动态注册文档

使用示例

注册新客户端

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"]
  }'

响应:

{
  "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
}

读取客户端配置

curl http://localhost:3000/oauth/register/CLIENT_ID \
  -H "Authorization: Bearer REGISTRATION_ACCESS_TOKEN"

更新客户端

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"]
  }'

删除客户端

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 客户端库
  • 向后兼容现有的手动客户端配置方式