跳到主要内容

Cloudflare Access 身份认证

Cloudflare Access 是可选功能。适合希望用公司身份(Google、邮箱 OTP、SSO 等)登录仪表盘,而不是只靠分享 NUXT_SITE_TOKEN 的场景。

无论是否启用 Access,短链接都保持公开。Access 只影响谁能打开仪表盘、谁能调用 API。

启用后会发生什么

路径未启用 Access推荐的 Access 配置
短链接(/abc公开仍然公开
仪表盘(/dashboard知道站点令牌即可先通过 Cloudflare Access,再使用仪表盘
API(/api/**站点令牌(Bearer …站点令牌 有效的 Access 登录(浏览器 Cookie / JWT)
API 文档(/_docs在你的域名上公开仍公开;若不想公开,需在 Access 中单独保护

Sink 不会因为「有 Cookie」就放行。它会校验 Access JWT — 可以把它想成一张有时效的电子通行证(会检查签名、签发者、受众和过期时间)。

推荐配置(大多数人用这个)

目标:用 Access 保护仪表盘,短链接保持公开,脚本/扩展仍可用站点令牌调用 /api

1. 创建 Access 应用

在 Cloudflare Zero Trust 中,为 Sink 域名(例如 links.example.com)创建一个 Self-hosted Access 应用。

2. 选择 Access 保护哪些路径

在 Access 应用的路径规则中:

路径是否用 Access 保护原因
/dashboard 及其子路径管理后台
/api(推荐)让脚本、扩展仍可用站点令牌调 API,不必再过 Access
短链接路径访客必须能直接打开短链
/_docs可选只有不想公开 OpenAPI 时才保护

在 Access 应用设置中,保持 Cookie Path 为空/未限制,这样浏览器从仪表盘调用 /api 时,已签名的 Access Cookie 才能带上。

如果 Cookie Path 只限 /dashboard,可能出现:仪表盘能打开,但 API 一直 401。

4. 配置 Sink 环境变量

两个值都要填。同时设置后才会启用 Access:

ini
NUXT_CF_ACCESS_TEAM_DOMAIN=https://your-team.cloudflareaccess.com
NUXT_CF_ACCESS_AUD=paste-application-aud-here
变量从哪里拿
NUXT_CF_ACCESS_TEAM_DOMAINZero Trust 团队域名。用完整源地址、不要带路径:https://<team>.cloudflareaccess.com
NUXT_CF_ACCESS_AUDAccess 应用 → Application Audience (AUD) Tag

设置后重新部署。

5. 仍然保留高强度站点令牌

启用 Access 后,仍要设置高强度的 NUXT_SITE_TOKEN

  • API 客户端和集成仍会用它
  • 它是备用管理凭据
  • 任何能打到这个 Worker/Pages 的域名,只要边缘没拦,仍可能接受站点令牌

人和工具分别怎么登录

txt
浏览器 → Access 登录页 → 仪表盘
         ↘ Access Cookie/JWT → Sink 校验通过 → /api 可用

脚本/扩展 → Authorization: Bearer <NUXT_SITE_TOKEN> → /api 可用
  • 人(浏览器): 先过 Access,再正常使用仪表盘。退出登录走 Cloudflare(/cdn-cgi/access/logout)。
  • 工具(API): 发送 Authorization: Bearer YOUR_SITE_TOKEN。自动化优先用这种方式。
  • Access 服务令牌: 若 Access 策略允许,Sink 会把它当作完整管理员(root)。只允许受信任的服务令牌。

更严格的选项:连 /api 也保护

你也可以把 /dashboard/api放进 Access。

这样未通过 Access 的请求会在 Cloudflare 边缘被拦下,到不了 Sink。只带站点令牌、不过 Access 的客户端,将无法调用该域名。

如果既要:

  • 人用 Access 登录仪表盘,又要
  • 自动化只靠 Bearer 令牌、不过 Access,

请用上面的推荐配置,或给自动化单独准备一个不走 Access 的域名。

重要限制

保护每一个域名

如果 app.example.com 开了 Access,但 old.example.com 也指向同一套 Sink 且没开 Access,旧域名的安全性仍只取决于 NUXT_SITE_TOKEN。所有能访问应用的域名都要保护。

会话时长仍然重要

Sink 在本地校验 JWT。你在 Access 里撤销会话后,旧 JWT 在过期前仍可能可用。请按风险选择合适的 Access 会话时长。

Cloudflare 参考资料