Authorization: Bearer <token>。
四种凭据
它们不能互换,用错种类是最常见的对接问题。JWT,8 小时
POST /api/auth/login 和 CLI 设备流返回的东西,代表一个人。里面带角色,所以管理员的 token
能打开管理接口。你写脚本代表自己操作时用的就是它。30 天
和 access token 一起签发,但只通过
httpOnly Cookie 下发,不进响应体——浏览器里的 JavaScript
读不到它。POST /api/auth/refresh 用它换新的 access token。命令行客户端不用它,改走设备流。30 天,绑定单次运行
以
STARFORGE_TOKEN 注入训练容器,只对一次 run 有效,也只有 /api/ingest/* 认它。作业手里只有这个,
永远拿不到你的账号凭据。见从训练代码回传。角色只有
admin 和 operator(控制台上把后者显示为「Member」)。operator 的 token 打管理接口返回 403,不是 401——后者会让人误以为
token 有问题。从浏览器或脚本登录
GET /api/auth/config 看看这套部署
支持哪些登录方式,别想当然。
从没有浏览器的机器登录
设备流,RFC 8628。sf login --device-flow 走的就是这条路,SSH 会话和构建机上应该用它。
1
申请验证码
2
在浏览器里批准
在任何一台已登录的设备上打开
verification_uri_complete。3
轮询直到批准
authorization_pending,批准后返回 access token 和 expires_in。
轮询间隔不要低于 5 秒,上限是每分钟 20 次。确认成功
401,说明 token 没带、格式不对或已过期——先重新登录,再去查别的。
过期怎么办
access token 默认 8 小时(部署侧FORGE_JWT_HOURS 控制)。过期后接口返回 401。按你的身份分两种恢复方式:
- 浏览器会话:带 refresh Cookie 调
POST /api/auth/refresh。 - 脚本或 CI:重新登录,或重跑设备流。不要跨次运行缓存 token 然后赌它还能用;
先看
GET /api/auth/me,遇到401就重新认证。
POST /api/auth/logout 会吊销 refresh token;部署配了 Redis 时,access token 也会立即失效,
而不是等到自然过期。
为什么 refresh token 从不出现在响应体里
为什么 refresh token 从不出现在响应体里
JavaScript 能读到的 token,注入的脚本也能偷走,而 30 天的 refresh token 比 8 小时的 access token
值钱得多。放进
httpOnly Cookie,意味着一个 XSS 漏洞的代价是一次会话,而不是一个月的访问权。
这同时也意味着命令行客户端根本用不了它——设备流因此是一条独立设计的路径,而不是补丁。