OAuth授权服务

AuthKit是一个专为MCP服务器设计的独立OAuth 2.1授权服务器,简化了OAuth规范的实现。

  • by OpZero-sh
  • JavaScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 OpZero-sh/MCPAuthKit

使用说明

MCP认证工具包

MCP服务器的OAuth 2.1。一个工人。五分钟。

每个MCP服务器构建者都遇到了同样的问题:OAuth规范是残酷的。
AuthKit是墙的另一边。

一个单一的Cloudflare Worker+D1数据库,处理整个MCP OAuth规范-- 发现、注册、同意、令牌——这样你的MCP服务器就不必这么做了。

在生产中运行 auth.opzero.sh,为OAuth提供支持 OpZero.sh.

开始使用 · 运作原理 · api参考 · 战争故事


问题

您想构建一个MCP服务器。Claude、ChatGPT和其他客户端需要使用您的服务器对用户进行身份验证。规范说:实现OAuth 2.1。

这意味着RFC 9728(受保护的资源元数据)、RFC 8414(授权服务器元数据)、RFC7591(动态客户端注册)、具有S256的PKCE、同意屏幕、令牌刷新、令牌撤销和多租户支持。在你的第一次工具调用开始之前。

我们花了数周时间与之斗争。然后我们把它撕成了自己的服务。

解决方案

AuthKit是专为MCP构建的独立OAuth授权服务器(约600行)。您的MCP服务器指向其 authorization_servers 到AuthKit,整个OAuth舞蹈——注册、同意、令牌——都发生在这里。

MCP服务器的唯一任务: 验证Bearer令牌。

// Your MCP server's /.well-known/oauth-protected-resource
{
  "resource": "https://your-mcp-server.com/mcp",
  "authorization_servers": ["https://your-authkit-instance.com"],
  "bearer_methods_supported": ["header"]
}

这就是整个整合。

它实现了什么

规格 内容 状态
RFC 9728 受保护的资源元数据 每台服务器自动生成
RFC 8414 授权服务器元数据 完成
RFC 7591 动态客户端注册 完成
OAuth 2.1 授权码+PKCE(S256) 完成
-- 令牌刷新(30天TTL) 完成
-- 令牌撤销 完成
-- 登录/注册同意屏幕 完成
-- 多租户(多个MCP服务器) 完成

运作原理

Claude / ChatGPT         AuthKit (CF Worker + D1)       Your MCP Server
     |                           |                           |
     |  POST /mcp (no token)     |                           |
     |------------------------------------------------------------>|
     |  401 + WWW-Authenticate   |                           |
     |<------------------------------------------------------------|
     |                           |                           |
     |  GET /.well-known/oauth-protected-resource            |
     |------------------------------------------------------------>|
     |  { authorization_servers: ["https://authkit..."] }    |
     |<------------------------------------------------------------|
     |                           |                           |
     |  GET /.well-known/oauth-authorization-server          |
     |-------------------------->|                           |
     |  { endpoints... }        |                           |
     |<--------------------------|                           |
     |                           |                           |
     |  POST /oauth/register     |                           |
     |-------------------------->|                           |
     |  { client_id }           |                           |
     |<--------------------------|                           |
     |                           |                           |
     |  GET /oauth/authorize     |                           |
     |-------------------------->|                           |
     |  [consent screen]        |                           |
     |<--------------------------|                           |
     |  [user approves]         |                           |
     |-------------------------->|                           |
     |  302 -> callback?code=xxx|                           |
     |<--------------------------|                           |
     |                           |                           |
     |  POST /oauth/token        |                           |
     |-------------------------->|                           |
     |  { access_token, ... }   |                           |
     |<--------------------------|                           |
     |                           |                           |
     |  POST /mcp (Bearer mat_xxx)                           |
     |------------------------------------------------------------>|
     |                           |  GET /oauth/userinfo      |
     |                           |<--------------------------|
     |                           |  { sub, email, name }     |
     |                           |-------------------------->|
     |  [tools response]         |                           |
     |<------------------------------------------------------------|

快速开始

先决条件

部署

git clone https://github.com/OpZero-sh/MCPAuthKit.git
cd MCPAuthKit

npm install

# Create the D1 database
wrangler d1 create mcp-authkit-db
# Update wrangler.toml with your database_id from the output above

# Initialize the schema
wrangler d1 execute mcp-authkit-db --file=schema.sql

# Set your admin secret
wrangler secret put ADMIN_KEY
# -> enter a strong random string

# Deploy
wrangler deploy

住在 https://mcp-authkit.<your-subdomain>.workers.dev.

注册您的MCP服务器

curl -X POST https://your-authkit.workers.dev/api/servers \
  -H "Authorization: Bearer YOUR_ADMIN_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My MCP Server",
    "resource_url": "https://my-mcp.com/mcp",
    "scopes": ["mcp:tools"]
  }'

答复:

{
  "server_id": "srv_abc123...",
  "api_key": "sak_xyz789...",
  "prm_url": "https://your-authkit.workers.dev/prm/srv_abc123...",
  "message": "Set authorization_servers in your PRM to point to this gateway."
}

连接您的MCP服务器

将服务器的受保护资源元数据指向AuthKit实例,并通过验证令牌 /oauth/userinfo 终点。就这样

看 集成指南 完整的演练。

api参考

方法 端点 描述
GET /.well-known/oauth-authorization-server 授权服务器元数据(RFC 8414)
POST /oauth/register 动态客户端注册(RFC 7591)
GET /oauth/authorize 授权+同意UI
POST /oauth/token 代码->与PKCE进行令牌交换
POST /oauth/revoke 令牌撤销
GET /oauth/userinfo 访问令牌中的用户信息
GET /prm/:server_id 自动生成的受保护资源元数据(RFC 9728)
POST /api/servers 注册MCP服务器(管理员)
GET /health 健康检查

看 api参考 有关请求/响应的详细信息。

令牌格式

类型 前缀 生存期 示例
访问令牌 mat_ 1小时 mat_dhcbqsgb...
刷新令牌 mrt_ 30天 mrt_ydqd0ug1...
验证码 code_ 10分钟 code_zkm6ukm...
服务器API密钥 sak_ 永久 sak_6rvstdl7...

所有令牌在存储之前都经过哈希(SHA-256)处理。明文在创建时只返回一次。

项目结构

mcp-authkit/
  src/
    worker.js              The entire OAuth gateway (~600 lines)
  docs/
    integration.md         How to wire up your MCP server
    api.md                 Full API reference
    how-it-works.md        Deep dive on the OAuth flow
    decisions.md           Why we built it this way
    war-story.md           10 attempts, every bug, the full timeline
  scripts/
    test-flow.sh           End-to-end OAuth flow test
  schema.sql               D1 database schema (7 tables)
  wrangler.toml            Cloudflare Worker config
  package.json

战争故事

这个项目之所以存在,是因为我们花了 5天内尝试10次 试图让MCP OAuth在带有Better Auth的Next.js应用程序中工作。在env变量中跟踪换行符、布尔值与字符串同意重定向、将哈希令牌与原始字符串进行比较、缺少OPTIONS处理程序、未记录的配置标志——每个错误都表现为“什么都没发生”

转折点是意识到OAuth是基础设施,而不是产品。把它撕下来。

  • 战争故事 --所有10次尝试,每个错误,完整的时间线
  • 架构决策 --为什么选择Cloudflare Workers,为什么选择独立

注意事项

这是一个为真实产品提供动力的参考实现。它不是:

  • 具有SLA的维护库
  • Auth0/Stytch/职员的替代品
  • 大规模的战斗测试(它适用于我们的流量)

用它来学习、分叉、窃取图案。如果您需要支持生产身份验证,请使用专用的身份验证提供程序。

由OpZero制造

OpZero 的 是一个AI原生部署平台。从任何MCP客户端(Claude、Cursor或您自己的代理)将网站发送到Cloudflare、Netlify和Vercel。

AuthKit是为其提供支持的OAuth层。我们将其开源,因为每个MCP构建者都不必对抗相同的规范。

贡献

欢迎捐款。看 贡献.md 作为指导方针。

许可证

麻省理工学院


建造于 @杰夫 为了 OpZero.sh

如果这为您省去了OAuth带来的麻烦,请给 OpZero 的 看一眼--
这是我们为之构建的部署平台。