启用客户端授权
默认模板已经启用个人授权中心,并自动注册 mcphub-portal 和 MCPBridge 客户端,无需部署身份服务或手工注册这些客户端。下列自定义注册要求适用于外部认证的高级部署;内建模式只需在改变客户端 ID、回调或资源地址时配置相应注册。
启用 client_authorization.enabled、配置用户门户 client_id,并启用托管数据库。支持 SQLite 和 单实例 MCPHub + PostgreSQL,新数据库使用 schema 10,重启时保留数据库与匹配密钥。
在身份服务注册门户回调 https://hub.example.com/client-auth/auth/callback。门户位于 MCP 服务的域名下,与管理端口分开。CLI 与门户必须取得 audience 为完整 MCP resource URL、issuer + sub 一致的 JWT access token。若身份服务对不同客户端返回不同的 pairwise subject,应先调整身份服务的主体策略;不会通过 email 拼接身份。门户可选的 client secret 通过服务端 client_secret_env 配置。
以下是追加到现有完整 YAML 根级别的片段,不要替换整个配置文件;client_id 改为已注册的门户客户端 ID。
client_authorization:
enabled: true
client_id: mcphub-portal
require_client_grant: false
max_grant_ttl: 8h
直接运行二进制时重启服务。Compose 部署将片段加入挂载的 deploy/config.remote-postgres.yaml,在原来的部署环境执行 docker compose -f deploy/compose.postgres.yaml up -d --force-recreate mcphub。还需单独注册员工 CLI 的公开客户端,按外部 OIDC 注册配置 PKCE、回调和 MCP audience。先发布一个明确 read 的工具并为组授予相应 Scope,并将用户加入组,再让员工运行 setup;空的 backends: [] 或 published_tools: [] 不会自动产生可选工具。
在指定 backend 或 HTTP 工具组设置 require_client_grant: true,可逐个设置;全局开启则全部强制。两级条件取 OR。不带 --client 的连接只能访问未强制客户端授权的 endpoint,登录握手不会暴露严格 endpoint。门户全局设置属于静态进程配置,修改后重启;endpoint 设置沿用现有配置治理流程。
普通用户在门户确认自己的客户端范围;管理员可以查询和撤销,不能代替用户同意。外部 issuer 下,CLI 还需要公开 OAuth 客户端注册;启用 SSO 桥接时按 SSO 指南配置本地公开客户端。
client_authorization
用户门户与客户端 Grant 需要 admin.enabled: true 和托管数据库。此段所有字段修改后都需重启。注册与启用流程见管理员手册。
| 字段 | 默认值 | 说明 |
|---|---|---|
enabled |
false |
启用用户门户和客户端授权。仅打开 admin 不会打开此功能。 |
client_id |
无 | 启用时必填,普通用户门户的 OAuth 客户端;不同于 CLI 或管理员客户端。 |
client_secret_env |
无 | 可选机密客户端的 Secret 变量名;Hub SSO 下的门户使用公开客户端,不得设置。 |
require_client_grant |
false |
全局强制;与 endpoint 上同名字段取 OR。任一级为 true 都要求开启本模块。 |
max_grant_ttl |
8h |
单次用户授权的最长有效期,范围 1m–8h。 |
客户端凭证与连接边界
严格客户端授权中,Bridge/Broker 单项授权使用用户 Token 加不透明 MCPHub-Grant;标准 OAuth 会话由服务端绑定内部服务授权,只需 Bearer Token。有效 Scope 仍是当前 Token 与单项授权的交集。每次请求校验 issuer、用户、resource、endpoint UID、期限、工具发布状态、资源条件和当前策略。修改 scope/目标、停用或同名重建 endpoint、改变 HTTP 工具执行语义后需重新确认。新工具不会自动进入旧授权;用户 Token 与 Grant 均不转发上游。
私有 socket/named pipe、OS 对端检查和独立 IPC 凭证限制其他系统用户接入,但不能证明应用身份,也不能隔离同一系统账户下的恶意进程。发布流程要求 Windows x64、ARM64 的原生 CLI 测试(含 Broker IPC)通过;macOS/Linux 使用 Unix socket 与 OS 对端校验。完整边界及验证记录见方案文档。
新部署模板默认设置 client_authorization.require_client_grant: true:用户 Token 只完成身份验证,业务工具还需经网页确认的 ClientGrant。内建签发者发布设备授权元数据;服务端 device_authorization_endpoint 不是上游身份源的端点。详见用户手册。
标准 OAuth 客户端在运维中心登记,或在 auth.sso.clients[] 设置 require_consent: true 与 name。多服务授权、草稿和备份见管理员手册。
Agent 链接授权
内建签发者部署可将用户登录与客户端同意合并在一个网页中。本机、SSH 或容器上的 Agent 都可以使用,不需要浏览器回调到 Agent 机器。使用同一系统用户和同一 MCPHUB_HOME 私有目录执行:
mcpbridge pair start --server https://hub.example.com/mcp --profile work --name "项目助手" --json
mcpbridge pair finish --request pr_example --wait --json
mcpbridge connect --profile work --client ci_example
替换实际返回的请求与客户端 ID。向用户展示 verification_uri_complete 和 user_code;用户核对配对码后,以本地账号、LDAP 或 OIDC 登录,选择服务、工具、资源限制和期限,再确认。工具默认不勾选,写能力默认关闭。无 --wait 时只检查一次;pending_user 仍需用户确认,ready 表示私有凭证保存与 MCP 连接检查完成。默认申请最长 1 小时,受网关上限约束;申请 5 分钟到期,轮询初始间隔 5 秒。--ttl 接受秒数(至少 60),--endpoint、重复 --tool / --scope 可收窄请求。
Agent 没有命令执行能力时,将 stdio 连接参数设为:
["connect", "--server", "https://hub.example.com/mcp", "--profile", "work", "--name", "项目助手", "--interactive-auth"]
会话立即初始化,仅开放 mcpbridge_auth_start 与 mcpbridge_auth_status。前者复用同一个未过期申请;后者可能领取、保存凭证并检查连接,按结果的 interval 调用。ready 后刷新工具列表;不支持 notifications/tools/list_changed 时改用返回的 connect --profile … --client … 重新连接。失败的业务调用不会排队或自动重试,撤销或到期后需明确重新授权。
配对页面切换中英文时会保留所选服务、工具、授权时长和资源条件;仅在允许申请且存在可授权的写工具时显示写权限选项。配对码无效或过期时,在 Agent 重新发起申请后,可在当前页面输入新的配对码。资源条件错误不会结束申请,修正表单后可再次提交。
每次配对只授权一个服务及工具能力;提示词、资源 URI 或订阅使用原有向导。权限受当前组和已确认范围共同约束,新工具不会自动扩权。所有私有凭证留在 MCPBridge,禁止复制 Token 给 Agent。失败不会覆盖原有可用 profile;换用户或服务器需另建 profile。纯外部签发者继续使用 PKCE 登录与 setup。