Docs/ API 参考/ API 认证

API 认证

所有 REST 端点都位于 /api/v1 之下。脚本、CI 任务和集成使用 API 密钥进行身份验证;控制台使用 Cookie 会话。

API 密钥

API 密钥是唯一面向程序的凭据。请为每个工具单独创建一个,这样撤销某个集成时不会影响其他集成:

  1. 在控制台中打开设置 → API 密钥,然后点击创建 API 密钥。
  2. 为它起一个能说明用途的名字,例如“CI 流水线”。
  3. 选择访问级别,并可按需设置过期日期。
  4. 请立即复制密钥:它只显示一次,并以哈希形式存储。如果丢失,请删除并重新创建。

密钥以 sh0_ 开头。密钥的权限永远不会超过创建它的账户,并且密钥不能创建其他密钥。

访问级别

每个密钥带有三种访问级别之一,服务器会在每个请求上强制执行。通过 API 创建时,级别对应 scopes 字段:read、deploy 或 admin。

级别可以不可以
只读
read
查看应用、部署、日志、指标和配置,包括环境变量、数据库凭据、备份以及容器内的文件。不能更改任何内容:不能部署、重启、创建或删除。无终端,无主机访问。
部署
deploy
只读级别的全部权限,外加对已有应用的部署、回滚、重启、启动、停止和扩缩容,以及为其上传新的归档:密钥会运行它上传的代码。不能创建或删除应用,不能更改其设置、域名或环境变量,也不能管理节点、用户、密钥或服务器设置。无终端。
管理
admin
您的账户能做的一切,包括创建和删除资源、终端以及主机访问。永远不超过您自己的角色。不能创建其他 API 密钥,也不能管理登录身份或双因素要求。
Tip
为每个工具授予能满足需要的最窄级别:只负责重新部署已有应用的 CI 任务用“部署”,监控脚本用“只读”。
Warning
只读级别仍会暴露机密:它可以读取环境变量和数据库凭据。请像对待密码一样对待每个密钥,切勿提交到代码仓库。

使用密钥

在每个请求的 Authorization: Bearer 请求头中发送密钥:

Terminal
export SH0_TOKEN="sh0_..."
curl https://panel.example.com/api/v1/apps \
  -H "Authorization: Bearer $SH0_TOKEN"
Warning
X-API-Key 请求头不会被读取。只携带它的请求会被视为匿名请求,返回 401 “No authentication token provided”。

控制台会话

控制台通过 POST /api/v1/auth/login 登录。成功后,服务器设置 HttpOnly Cookie(sh0_access 和 sh0_refresh),并在响应体中返回 csrf_token;响应体中不返回任何令牌。此流程面向浏览器:脚本请使用 API 密钥。

访问会话有效期为 24 小时。控制台通过 POST /api/v1/auth/refresh 续期,该操作同时签发一个新的 30 天刷新会话;连续 30 天未使用的会话将结束。

修改密码会注销所有其他会话。登录尝试限制为每 15 分钟 5 次失败;输入正确的密码不计入限制。

双因素登录

当账户启用了双因素认证时,登录不会直接建立会话,而是返回 requires_totp 和一个短时有效的 totp_nonce。客户端随后将该 nonce 与 6 位验证码(或备用码)发送到 POST /api/v1/auth/totp/verify。验证限制为每 5 分钟 5 次。

CSRF 防护

通过会话 Cookie 认证的请求,在每个会修改状态的调用中都必须在 X-CSRF-Token 请求头中重复 CSRF 令牌。通过 Authorization 请求头中的 API 密钥认证的请求不需要它。

身份验证错误

错误使用标准错误结构。例如,未知或已撤销的密钥:

401 Unauthorized
{"error":{"code":"UNAUTHORIZED","message":"Invalid API key"}}
HTTPCode含义
401UNAUTHORIZED未提供凭据、密钥未知/已过期/已撤销、会话已过期,或登录时邮箱或密码错误
403FORBIDDEN已认证,但密钥的访问级别或账户角色不允许此操作
429RATE_LIMITED尝试次数过多:每 15 分钟 5 次登录失败,或每 5 分钟 5 次双因素验证