MCP 服务器通常需要代表已通过身份验证的用户调用内部应用程序。例如,帮助员工与内部工具进行交互的 MCP 服务器需要将用户的身份转发给这些下游服务(MCP 服务器连接的内部应用程序),以便使用正确的权限授权每个请求。
关联应用令牌(Linked App Token)策略选择器通过允许一个应用程序上的 Access 策略接受为另一个应用程序签发的令牌来实现此目的。根据您的 MCP 服务器的部署方式,有两种设置方法。
如果您的 MCP 服务器是一个自托管 Access 应用程序,Cloudflare Access 会自动处理身份验证。MCP 服务器会在 Cf-Access-Jwt-Assertion 标头中从 Access 接收用户的 JWT,并应将其在 Cf-Access-Token 标头中转发给下游应用程序。您的 MCP 服务器代码中不需要实现 OAuth。
flowchart LR
accTitle: 自托管 MCP 服务器访问内部应用程序
User --> client["MCP 客户端"]
client --> mcp["MCP 服务器 <br>(自托管应用)"]
mcp -- "Cf-Access-Token: <JWT>" --> app1["内部 API <br>(自托管应用)"]
mcp -- "Cf-Access-Token: <JWT>" --> app2["公司 Wiki <br>(自托管应用)"]
idp[身份提供商] <--> mcp
- 将您的下游应用程序(例如,您的
内部 API和公司 Wiki)添加为自托管 Access 应用程序。 - 将您的 MCP 服务器添加为自托管 Access 应用程序。
在 MCP 服务器需要访问的每个自托管应用程序上(例如 内部 API 和 公司 Wiki 应用),创建一个关联应用令牌(Linked App Token)策略:
-
在 Cloudflare 仪表板 ↗中,前往 Zero Trust > Access controls(访问控制) > Applications(应用程序)。
选择 the downstream application,然后选择 Edit(编辑)。
-
前往 Policies(策略) 选项卡,然后选择 Create new policy(创建新策略)。
-
将策略 Action(操作) 设置为 Service Auth。
-
对于 Selector(选择器),选择 Linked App Token。
对于 Value(值),选择 the MCP server application。例如:
Action(操作) Rule type(规则类型) Selector(选择器) Value(值) Service Auth(服务身份验证) Include(包含) Linked App Token mcp-server-app-
保存策略。
在 the downstream application 中,将策略添加到 Access policies(Access 策略) 列表。
-
保存应用程序。
获取 the MCP server application 的
uid:
At least one of the following token permissions is required:Required API token permissions
Access: Apps and Policies RevokeAccess: Apps and Policies WriteAccess: Apps and Policies Read
List Access applicationsbash curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/apps" \ --request GET \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"{ "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "type": "self_hosted", "name": "mcp-server-app", ... }在下游应用程序上创建 Access 策略,将
app_uid值替换为 the MCP server application 的uid:
At least one of the following token permissions is required:Required API token permissions
Access: Apps and Policies Write
Create an Access reusable policybash curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/policies" \ --request POST \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ --json '{ "name": "Allow requests from MCP server", "decision": "non_identity", "include": [ { "linked_app_token": { "app_uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" } } ] }'
在您的 MCP 服务器代码中,将传入请求中的 Cf-Access-Jwt-Assertion 标头作为传出请求中的 Cf-Access-Token 标头转发给下游应用程序:
Cf-Access-Token: <JWT from Cf-Access-Jwt-Assertion>Access 现在将针对关联应用令牌规则验证 JWT 令牌,并将用户的身份传播到下游应用程序。
如果您的 MCP 服务器注册为 Access for SaaS OIDC 应用程序并实现了 MCP OAuth ↗,它将从 Cloudflare Access 接收 OAuth access_token。MCP 服务器会在 Authorization: Bearer 标头中将此令牌转发给下游自托管应用程序。
这种方法需要您的 MCP 服务器实现 OAuth 授权码流程。如果您希望 Cloudflare 为您处理身份验证,请使用自托管 MCP 服务器方法。
flowchart LR
accTitle: SaaS MCP 服务器访问内部应用程序
User --> client["MCP 客户端"]
client --> mcp["MCP 服务器 <br>(Access for SaaS 应用)"]
mcp -- "Authorization: Bearer <token>" --> app1["内部 API <br>(自托管应用)"]
mcp -- "Authorization: Bearer <token>" --> app2["公司 Wiki <br>(自托管应用)"]
idp[身份提供商] <--> mcp
- 将您的下游应用程序(例如,您的
内部 API和公司 Wiki)添加为自托管 Access 应用程序。 - 将您的 MCP 服务器添加为 Access for SaaS OIDC 应用程序。
在 MCP 服务器需要访问的每个自托管应用程序上(例如 内部 API 和 公司 Wiki 应用),创建一个关联应用令牌(Linked App Token)策略:
-
在 Cloudflare 仪表板 ↗中,前往 Zero Trust > Access controls(访问控制) > Applications(应用程序)。
选择 the downstream application,然后选择 Edit(编辑)。
-
前往 Policies(策略) 选项卡,然后选择 Create new policy(创建新策略)。
-
将策略 Action(操作) 设置为 Service Auth。
-
对于 Selector(选择器),选择 Linked App Token。
对于 Value(值),选择 the MCP server application。例如:
Action(操作) Rule type(规则类型) Selector(选择器) Value(值) Service Auth(服务身份验证) Include(包含) Linked App Token mcp-server-app-
保存策略。
在 the downstream application 中,将策略添加到 Access policies(Access 策略) 列表。
-
保存应用程序。
获取 the MCP server application 的
uid:
At least one of the following token permissions is required:Required API token permissions
Access: Apps and Policies RevokeAccess: Apps and Policies WriteAccess: Apps and Policies Read
List Access applicationsbash curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/apps" \ --request GET \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"{ "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "type": "saas", "name": "mcp-server-app", ... }在下游应用程序上创建 Access 策略,将
app_uid值替换为 the MCP server application 的uid:
At least one of the following token permissions is required:Required API token permissions
Access: Apps and Policies Write
Create an Access reusable policybash curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/policies" \ --request POST \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ --json '{ "name": "Allow requests from MCP server", "decision": "non_identity", "include": [ { "linked_app_token": { "app_uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" } } ] }'
配置 MCP 服务器以在传出请求中转发 access_token:
Authorization: Bearer ACCESS_TOKEN- 关联应用令牌策略只能添加到自托管应用程序,无法添加到 SaaS 应用程序或其他应用程序类型。
- 该功能最适合依赖 Cloudflare Access JWT 进行身份验证和身份识别的应用程序。如果下游应用程序在 Cloudflare Access 之后实现了自己的身份验证层,通过 Access 验证的请求仍可能被该应用程序本身拒绝。
- 当上游应用程序使用 Managed OAuth 时,客户端收到的是不透明访问令牌,而非 JWT。客户端无法将此令牌作为
Cf-Access-Token标头直接转发给下游应用程序。此时,上游应用程序的源站必须读取Cf-Access-Jwt-Assertion标头(其中包含已解析的 JWT),并将其作为Cf-Access-Token转发给下游应用程序。如果您希望客户端无需代理即可访问多个端点,请考虑改用多域 Access 应用程序。