Repository navigation
feat(mcp): 动态 OAuth 授权(浏览器弹窗登录)——AS + 同意页 + 前端回跳 - #117
Merged
Merged
Conversation
三张表(DCR 客户端 / 授权请求-授权码一体 / access+refresh token 族)+ 业务编排(单次性授权码、refresh 轮换与重放连坐撤销、Fernet secret), TopicEyeTokenVerifier 先查 OAuth access token 再回落存量静态 token。
AS 路由挂 FastAPI 根路径(issuer=SITE_BASE_URL,非法时显式报错跳过), 同意页三个会话认证端点 /api/v1/mcp-oauth/*,/authorize /token /register 限流,调度器每日清理过期授权行与 token。
/mcp/authorize 同意页复用登录态(未登录带 returnTo 跳 /login,回跳地址 净化防开放重定向),next 代理 /authorize /token /register /revoke 与 /.well-known 保证单源部署 issuer 可达。
AGENT_API.md 补全 AS 端点表、两种认证方式与运维注记(含 /revoke 需带 client_secret 键的 SDK quirk);AGENTS.md 更新 app/mcp 入口层职责描述。
11 tasks
① /authorize 换自建包装路由:解析发起者会话经 contextvar 入库(initiator_user_id 并列进未上线迁移),匿名先跳登录页带 returnTo 续传,info/approve/deny 仅发起者 可用——堵住「攻击者发起、诱导受害者批准」的 approve-any 冒用路径。 ② 工具级 scope 中央闸门 fail-closed(app/mcp/scopes.py):未登记工具直接拒绝, CI 断言工具集与登记集一致,首个写工具的真实 scope 语义排期 issue #118。 ③ 已消费授权码重放留下泄密信号告警(整族撤销随 #118)。 含两个配置「有意为之」注释与 request_id 熵值(uuid4≈122bit)文档修正。
DCR 开放注册、客户端名可任意取(含仿冒官方),同意页原是整身官方皮肤—— 加粗警示置于回调主机旁补齐知情权;日报缺失自动生成快照写入授权说明。 returnTo 指向后端路径(/authorize 经 next 代理)必须整页导航,客户端路由推不到。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What & why
MCP server 补齐 AGENT_API.md 声明 not yet implemented 的动态 OAuth 授权:MCP 客户端(Claude Code / ZCode 等)只配置
https://<host>/mcp一个 URL,首连自动走 OAuth 2.1 授权码 + PKCE + DCR(RFC 7591)弹浏览器登录授权。存量静态 token(个人 API token / session token)用法零改动。架构:实现官方 SDK(mcp 2.3.0)
OAuthAuthorizationServerProvider协议,AS 路由挂 FastAPI 根路径(issuer=SITE_BASE_URL,SDK 固定根路径 + RFC 8414 元数据要求);三张 PG 表(clients / authorizations / tokens);同意页走前端/mcp/authorize(复用登录态,顺带给 /login 加 returnTo);refresh 30 天轮换、重放检测整族撤销、client_secret Fernet 落库、raw token 只回传一次(库存 sha256)。安全加固批次(圆桌评审裁定,4:0/3:1/2:2 共识 + Conductor 裁定,见 commit 4ca2420):
Fixes #116
Area
Verification
bash backend/scripts/test_full_local.sh(一次性 PG 全量)exit 0——含加固批次后的完整套件npx tsc --noEmit、npm run test:coverage(199 passed + 覆盖率门禁)ruff check / format、check_layering、check_agent_docsVerifier verdict
pass — 两轮独立复核:①实现后(非实现过程)正交安全审查 PASS,三个次要发现已修(approve 原子化、@track_job、负向测试);②圆桌评审(4 席独立 Agent,纪要 .vidt/roundtables/)对四个残余风险逐项走攻击树与 RFC 条款,裁定全部落地或机器化排期——发起者绑定修复中顾衡(维护者席)核实代码后修正了攻击场景误读并倒戈支持现在修。
Checklist
issue-116-mcp-oauth-auth-server;正文Fixes #116;排期项挂 MCP OAuth 完整 scope 模型 = 首个写操作工具的前置 DoD(含 code 连坐/client GC) #118Notes for reviewer
/revoke表单必须含client_secret键(公共客户端传空值,上游RevocationRequest必填声明);provider 的load_access_token必须返回 OAuth client_id,否则 SDK 撤销归属校验静默跳过(已与 verifier 的 user.id 映射拆成两个函数);token 模型expires_at是 int。