身份认证
本节记录的每个端点,除 GET /v1/health 之外都需要 bearer 令牌:
Authorization: Bearer <token>
两种凭据
同一个请求头接受两种凭据类型,但它们能触及的范围并不一样。
| 会话令牌 | API 密钥 | |
|---|---|---|
| 形式 | 你登录控制台时签发的 JWT | shk_ 后跟 48 个十六进制字符 |
| 来源 | 浏览器会话,自动刷新 | 在控制台的 API 密钥页面创建一次 |
| 有效期 | 短期有效;会过期并刷新 | 直到你吊销它 |
| 行事所用的角色 | 你在组织里的真实角色,admin 或 member | 始终是 member |
| 组织 | 你选中的那一个 | 只有密钥创建时所在的组织 |
账户端点(/v1/me、/v1/ssh-keys) | 允许 | 拒绝,返回 401 TOKEN_INVALID |
| 管理员操作,包括计费 | 你是管理员时允许 | 拒绝,返回 403 ADMIN_REQUIRED |
凡是无人值守运行的东西,都用 API 密钥。会话令牌会过期,所以带着它的脚本会毫无预警地失效。创建和吊销的方法见 API 密钥。
curl -s "$SUPERHEAT_API/v1/instances" \
-H "Authorization: Bearer $SUPERHEAT_KEY"
选择组织
实例、模板、余额和密钥都属于某个组织。X-Org-Id 头决定一个请求作用于哪一个:
| 请求头 | 会话令牌 | API 密钥 |
|---|---|---|
| 未设置 | 你的个人组织 | 密钥自己的组织 |
| 设为你所属的某个组织 | 该组织,使用你在其中的角色 | 仅当与密钥的组织一致时才允许 |
| 设为你不属于的组织 | 403 NOT_A_MEMBER | 403 ORG_MISMATCH |
| 不是合法的 id | 400 INVALID_ORG_ID | 403 ORG_MISMATCH——密钥会先拿这个头和自己的组织 id 比对,再去校验它是否合法 |
curl -s "$SUPERHEAT_API/v1/instances" \
-H "Authorization: Bearer $SUPERHEAT_KEY" \
-H "X-Org-Id: 9c1b7d4e-3a52-4a1f-8c6d-b0e9f2a71c48"
用 GET /v1/orgs 列出你可以操作的组织,它会返回每个组织的 id、name、personal 标记、你的 role 以及余额。这个调用需要会话令牌。
失败情形
| 状态码 | 代码 | 含义 |
|---|---|---|
| 401 | TOKEN_INVALID | 缺少请求头、令牌格式错误、API 密钥未知或已吊销,或者把 API 密钥发到了账户端点 |
| 401 | TOKEN_EXPIRED | 会话令牌已过期——重新登录 |
| 403 | NOT_A_MEMBER | X-Org-Id 指定的组织不是你的 |
| 403 | ORG_MISMATCH | API 密钥所属的组织与 X-Org-Id 不是同一个 |
| 403 | ADMIN_REQUIRED | 该操作仅限管理员,或者你用 API 密钥去做了它 |
| 400 | INVALID_ORG_ID | 在会话令牌的请求中,X-Org-Id 不是一个合法的 id |
完整的响应结构见错误。
把密钥当密码对待
任何拿到 shk_ 密钥的人,都能部署实例、花掉你组织的余额。不要把密钥放进代码仓库;凡是粘贴到你无法控制的地方的密钥,一律吊销。