MCP 服务认证优化:移除自定义头部,统一 OAuth 2.0
2026年02月06日1 次阅读0 人喜欢
MCPOAuth 2.0认证系统CursorClaude Code
最近在优化博客的 MCP 服务认证机制,主要做了几件事:移除了自定义的认证头部,统一使用标准的 OAuth 2.0 Bearer Token,同时兼容两种使用方式。
背景
博客的 MCP 服务之前支持三种认证方式:
- 自定义头部
x-mcp-account和x-mcp-password - 标准
Authorization: Bearer <token> - OAuth 2.0 授权码流程
说实话,那个自定义头部是早期的遗留设计,当时为了兼容性加的。但既然大家都支持标准 OAuth 2.0 了,留着它确实没什么必要,反而增加维护成本。
修改内容
这次主要是清理了 src/services/mcpAuth.ts 中的自定义头部认证逻辑,简化了认证流程。
修改前
typescript
// 支持三种方式
export async function authenticateMcpRequestEnhanced(headers: Headers) {
// 1. Bearer Token
const user = await validateToken(token);
if (user) return user;
// 2. 长期 Token (LTK_)
if (token.startsWith('LTK_')) {
// ...
}
// 3. 自定义头部(已废弃)
const account = headers.get('x-mcp-account');
const password = headers.get('x-mcp-password');
// ...
}
修改后
typescript
// 只支持标准方式
export async function authenticateMcpRequestEnhanced(headers: Headers) {
// 1. 普通 Bearer Token
const user = await validateToken(token);
if (user) return user;
// 2. 长期 Token (LTK_)
if (token.startsWith('LTK_')) {
// ...
}
throw new Error("Invalid or expired token");
}
清爽多了。
现在支持的认证方式
方式一:Bearer Token(推荐用于简单配置)
这个适合直接配置,比如在 Cursor IDE 里:
json
{
"我的博客": {
"url": "https://www.nnnnzs.cn/api/mcp",
"headers": {
"Authorization": "Bearer LTK_your_token_here"
}
}
}
生成长期 Token 的步骤:
- 访问
/c/user/info页面 - 在"长期 Token"部分点击生成
- 复制
LTK_开头的 token
方式二:OAuth 2.0 授权码流程(推荐用于 CLI)
这个适合自动化流程,比如 Claude Code CLI:
bash
# 添加 MCP 服务
claude mcp add MyBlog https://www.nnnnzs.cn/api/mcp
# 触发认证
claude mcp auth MyBlog
CLI 会自动:
- 发现 OAuth 端点
- 打开浏览器进行授权
- 获取并保存 Token
- 后续自动使用 Token
客户端配置指南
Cursor IDE 配置
Cursor 目前不支持自动触发 OAuth 流程,所以需要手动配置 Token:
json
{
"我的博客": {
"url": "https://www.nnnnzs.cn/api/mcp",
"headers": {
"Authorization": "Bearer LTK_your_token_here"
}
}
}
Claude Code CLI 配置
Claude Code CLI 有专门的命令来处理 MCP 认证:
bash
# 添加服务
claude mcp add MyBlog https://www.nnnnzs.cn/api/mcp
# 触发认证(会自动打开浏览器)
claude mcp auth MyBlog
# 查看状态
claude mcp list
# 移除服务
claude mcp remove MyBlog
认证成功后,CLI 会自动保存 Token,后续请求会自动带上。
OAuth 2.0 端点
为了方便集成,服务提供了标准的 OAuth 2.0 端点:
/.well-known/oauth-authorization-server- 服务器元数据/register- 客户端注册/authorize- 用户授权/token- 获取 Token/revoke- 撤销 Token
完全符合 RFC 6749 (OAuth 2.0) 和 RFC 8414 (Authorization Server Metadata) 标准。
兼容性说明
这次修改只是移除了自定义头部,不会影响现有的 OAuth 2.0 流程。
如果你之前用的是自定义头部,需要迁移到 Bearer Token:
- 生成一个新的长期 Token(
LTK_开头) - 更新客户端配置,使用
Authorization: Bearer头部
总结
统一使用标准 OAuth 2.0 后,代码更简洁了,也更容易维护。
对于简单场景,用 Bearer Token 配置就行;对于需要自动化的场景,OAuth 2.0 授权码流程完全够用。
两种方式可以共存,根据实际需求选择就行。
说实话,早点移除自定义头部就好了,留着也是技术债务。