cnb-rs auth login
cnb-rs auth login [flags]登录 CNB 平台。
默认走 OAuth2 设备授权流(RFC 8628):cnb-rs 向 CNB 平台申请一次性设备码,提示用户在浏览器中完成授权,然后自动取回 access_token 与 refresh_token 并保存到 keyring。
也可以通过 --token / --with-token 直接提供 Personal Access Token(PAT),适合 CI/CD 等无头环境,或希望长期使用 PAT 的场景。
默认域名为 cnb.cool,可通过 --domain 全局参数覆盖。cnb-rs 也支持通过环境变量传递 Token,适合 CI/CD 等无头环境。详见 cnb-rs auth。
OAuth2 设备授权流(默认)
无 --token / --with-token 时的执行步骤:
- cnb-rs 调用
POST {platform}/oauth2/device/auth申请device_code与user_code - CLI 显示验证 URL 与
user_code,并自动尝试用系统浏览器打开授权页 - 用户在浏览器中完成授权
- CLI 后台轮询
POST {platform}/oauth2/token等待授权完成(spinner 提示) - 拿到 token 后调
GET /user验证并取用户名 - 将
OAuthSecretBlob {access_token, refresh_token, expires_at}以 JSON 形式保存到 keyring(若 keyring 不可用则回退到~/.cnb/config.toml)
OAuth client_id 默认为 cnb_cli,可通过 --client-id 或 OAUTH2_CLIENT_ID 环境变量覆盖。
PAT 登录(兼容路径)
显式提供 --token <TOKEN> 或 --with-token 时走 PAT 路径:
- 从参数或 stdin 获取 Token
- 调用
GET /userAPI 验证 Token 有效性 - 将裸 Token 字符串保存到 keyring(若 keyring 不可用则回退到
~/.cnb/config.toml)
PAT 路径写入 keyring 的是裸字符串,OAuth 路径写入的是 OAuthSecretBlob JSON;读取端通过 JSON 解析自动识别两种格式,因此 PAT 与 OAuth 账号可在同一域名共存。
TIP
如果当前正在使用 CNB_TOKEN 或 CNB_TOKEN_{DOMAIN} 认证,login 仍会正常写入本地账号,但会追加一条 warning 提示“环境变量仍生效,优先级高于本地 keyring;本次保存的账号要在 unset 该环境变量后才会生效”,以与 auth status 的 env + keyring 并存语义保持一致。
TIP
此命令不会撤销已有的远程 Token。如需管理已生成的 OAuth 授权或 PAT,请访问 CNB 平台的 个人设置 > 访问令牌 页面。
选项
--token <TOKEN>: 直接提供 Personal Access Token,走 PAT 登录路径(不进入设备授权流)--with-token: 从标准输入读取 Personal Access Token(与--token二选一)--client-id <CLIENT_ID>: OAuth2 设备授权流使用的 client_id(默认cnb_cli,也可由OAUTH2_CLIENT_ID环境变量提供)--insecure-storage: 将认证信息明文保存到~/.cnb/config.toml(适用于无 keyring 的环境)
继承的全局选项:
--domain <DOMAIN>: 指定目标域名(默认:cnb.cool)
示例
# 默认走 OAuth2 设备授权流
$ cnb-rs auth login
正在请求设备码...
请在浏览器中打开以下链接完成授权:
https://cnb.cool/login/device?user_code=ABCD-EFGH
用户码: ABCD-EFGH
(已尝试自动打开浏览器,若未打开请手动复制上方链接)
正在等待授权...
✓ 已登录为 octocat (cnb.cool)
# 从标准输入读取 PAT
$ cat mytoken.txt | cnb-rs auth login --with-token
正在验证 Token...
✓ 已登录为 octocat (cnb.cool)
# 直接指定 PAT
$ cnb-rs auth login --token cnb_xxxxxxxxxxxx
正在验证 Token...
✓ 已登录为 octocat (cnb.cool)
# 强制明文存储到配置文件
$ cnb-rs auth login --token cnb_xxxxxxxxxxxx --insecure-storage
正在验证 Token...
⚠ 认证信息已明文保存到 ~/.cnb/config.toml
✓ 已登录为 octocat (cnb.cool)
# 指定域名走 OAuth 流
$ cnb-rs --domain example.com auth login
正在请求设备码...
...
# 自定义 OAuth client_id
$ cnb-rs auth login --client-id my_app
# 通过环境变量传递 client_id
$ OAUTH2_CLIENT_ID=my_app cnb-rs auth login错误处理
| 错误场景 | 错误信息 | 退出码 |
|---|---|---|
| Token 为空 | Token 不能为空 | 1 |
| Token 无效 | Token 验证失败:{error} | 1 |
| 设备码申请失败 | 请求设备码失败:{error} | 1 |
| OAuth 授权失败/超时 | 授权失败:{error} | 1 |
| 网络不可达 | Token 验证失败:{error} | 1 |
| 配置文件写入失败 | IO 错误信息 | 1 |
环境变量存在时不再视为错误:login 会正常走完流程并在末尾追加 warning 行,退出码 0。
API
| 步骤 | API | 方法 | 说明 |
|---|---|---|---|
| 申请设备码 | ${platform}/oauth2/device/auth | POST | OAuth2 设备授权流(RFC 8628) |
| 轮询授权完成 | ${platform}/oauth2/token | POST | grant_type=urn:ietf:params:oauth:grant-type:device_code |
| Token 验证 | ${CNB_API_ENDPOINT}/user | GET | 获取当前用户信息验证有效性 |
OAuth 端点位于 platform URL(不带 api 前缀),例如默认域名对应 https://cnb.cool/oauth2/device/auth;API URL 仍是 https://api.cnb.cool/user。
Token 验证 API 详情(OpenAPI:GetUserInfo):
- 权限要求:
account-profile:r - 请求头:
Accept: application/vnd.cnb.api+jsonAuthorization: Bearer $CNB_TOKEN
- 响应类型:
dto.UsersResultForSelf - 关键响应字段:
{
"id": "string",
"username": "string",
"nickname": "string",
"email": "string",
"avatar": "string",
"bio": "string",
"company": "string",
"created_at": "string",
"repo_count": 0,
"group_count": 0,
"stars_count": 0,
"verified": 0
}cURL 示例:
curl -X GET \
"https://api.cnb.cool/user" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN"