MCP OAuth tokens for HTTP servers not reliably reused across sessions — duplicate cache-key entries force repeated re-auth
还没有人认领这个 Issue。
- 主要语言
- Shell
- 星标
- 11.2k
- 派生
- 1.9k
- 平均合并
- 14 小时 16 分钟
- 30 天内合并 PR
- 6
描述
Describe the bug
For an HTTP-type MCP server that uses OAuth (PKCE, public client — clientSecret: null), Copilot CLI appears to mint a new token-cache entry under a different cache-key hash more often than expected, instead of finding and reusing the one still-valid cached token for that server.
Over about 3 weeks of normal use, I have 13 separate <hash>.tokens.json files in ~/.copilot/mcp-oauth-config/ that are all for the exact same server URL + OAuth scope, when I'd expect at most one entry that gets updated/refreshed in place. Only 1 matching <hash>.json client-registration file exists for that server, so the token-cache key and the client-registration key appear to diverge over time.
Two of the 13 token files were written in the same second and contain byte-identical expiresAt epoch values, which strongly suggests a single OAuth completion got persisted under two different cache-key hashes rather than one canonical entry being reused.
Separately (possibly independent, possibly compounding): none of the 13 cached tokens contain a refreshToken field — only accessToken + expiresAt. Observed access-token lifetime is consistently ~75–90 minutes. Since there's no refresh token, once it expires there is no silent-refresh path and the full interactive browser consent flow must run again. Combined with the cache-key issue above, the net effect looks like "the token expires in under an hour and I constantly have to re-authenticate," when it's really a mix of (a) a genuinely short-lived, non-refreshable token, and (b) the client sometimes failing to locate a still-valid cached token for the same server.
Affected version
1.0.80
Steps to reproduce the behavior
- Configure an HTTP MCP server that requires OAuth (registered in
~/.copilot/mcp-config.jsonwith"type": "http", pointing at a server behind an internal API gateway). - Authenticate once via the interactive browser flow.
- Use the tool across multiple CLI sessions (including separate worktree-backed sessions) over several days.
- Inspect
~/.copilot/mcp-oauth-config/*.tokens.json— instead of a single file per server updated in place, multiple files accumulate for the identical server URL/scope. Some haveexpiresAtvalues identical to the second with another file. - In practice this surfaces as being prompted to re-authenticate noticeably more often than the access token's actual ~75–90 minute lifetime would suggest, i.e. sessions don't always find/reuse an already-valid cached token.
Expected behavior
- A given MCP server's OAuth token cache entry should be looked up and updated using a single, stable cache key (e.g., derived only from server/resource URL + client ID), not one that can vary across otherwise-identical auth attempts for the same server.
- When a still-valid, non-expired cached token already exists for a server, any session should find and reuse it rather than triggering a fresh interactive login.
- If a variable value (such as the randomly chosen local loopback redirect port used during the OAuth flow) is unintentionally being folded into the persisted cache-key, that would explain the duplicate-key behavior observed above.
Additional context
- OS: Windows 11 (Windows_NT)
- MCP server type:
http, OAuth with PKCE, public client - Token cache directory (
~/.copilot/mcp-oauth-config/) is per-user/global, not per-session, so in principle tokens should already be shareable across sessions/worktrees on the same machine — but the duplicate cache-key entries above show that reuse isn't happening reliably. - Observed access-token lifetimes across 13 samples for the same server: consistently ~75–90 minutes.
- No
refreshTokenfield present in any of the 13 cached token files for this server. - Docs describe
mcp-oauth-config/as file-based storage used "when keychain-backed storage is unavailable." On this machine (Windows 11 with Credential Manager available) it may be worth confirming why the file-based fallback path is being used at all, since that could be related to the cache-key inconsistency.
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
首先检查报告中提到的 OAuth 配置和缓存路径:~/.copilot/mcp-config.json 和 ~/.copilot/mcp-oauth-config/*.tokens.json。跟踪 HTTP MCP 服务器的 URL、scope、client 和 loopback 重定向端口如何共同影响持久化缓存键,然后在相互独立的 CLI 会话中验证:一个有效的 token 条目会被复用,而不是被重复创建或触发交互式登录。
由索引模型根据 Issue 内容生成。
评估
- 领域
- authentication, cli, security
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 活跃
- 描述清晰度
- 基本清楚
- 新手友好度
- 48/100