API 认证
所有 REST 端点都位于 /api/v1 之下。脚本、CI 任务和集成使用 API 密钥进行身份验证;控制台使用 Cookie 会话。
API 密钥
API 密钥是唯一面向程序的凭据。请为每个工具单独创建一个,这样撤销某个集成时不会影响其他集成:
- 在控制台中打开设置 → API 密钥,然后点击创建 API 密钥。
- 为它起一个能说明用途的名字,例如“CI 流水线”。
- 选择访问级别,并可按需设置过期日期。
- 请立即复制密钥:它只显示一次,并以哈希形式存储。如果丢失,请删除并重新创建。
密钥以 sh0_ 开头。密钥的权限永远不会超过创建它的账户,并且密钥不能创建其他密钥。
访问级别
每个密钥带有三种访问级别之一,服务器会在每个请求上强制执行。通过 API 创建时,级别对应 scopes 字段:read、deploy 或 admin。
| 级别 | 可以 | 不可以 |
|---|---|---|
只读read | 查看应用、部署、日志、指标和配置,包括环境变量、数据库凭据、备份以及容器内的文件。 | 不能更改任何内容:不能部署、重启、创建或删除。无终端,无主机访问。 |
部署deploy | 只读级别的全部权限,外加对已有应用的部署、回滚、重启、启动、停止和扩缩容,以及为其上传新的归档:密钥会运行它上传的代码。 | 不能创建或删除应用,不能更改其设置、域名或环境变量,也不能管理节点、用户、密钥或服务器设置。无终端。 |
管理admin | 您的账户能做的一切,包括创建和删除资源、终端以及主机访问。 | 永远不超过您自己的角色。不能创建其他 API 密钥,也不能管理登录身份或双因素要求。 |
使用密钥
在每个请求的 Authorization: Bearer 请求头中发送密钥:
export SH0_TOKEN="sh0_..."
curl https://panel.example.com/api/v1/apps \
-H "Authorization: Bearer $SH0_TOKEN"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 密钥认证的请求不需要它。
身份验证错误
错误使用标准错误结构。例如,未知或已撤销的密钥:
{"error":{"code":"UNAUTHORIZED","message":"Invalid API key"}}| HTTP | Code | 含义 |
|---|---|---|
| 401 | UNAUTHORIZED | 未提供凭据、密钥未知/已过期/已撤销、会话已过期,或登录时邮箱或密码错误 |
| 403 | FORBIDDEN | 已认证,但密钥的访问级别或账户角色不允许此操作 |
| 429 | RATE_LIMITED | 尝试次数过多:每 15 分钟 5 次登录失败,或每 5 分钟 5 次双因素验证 |