skillhub/docs/ai-changes-cli-oauth-device-flow.md
Danny 7cf9f22182
feat(cli): add OAuth device flow login (#857)
* feat(cli): add OAuth device flow login

Signed-off-by: Danny5487401 <64348131+Danny5487401@users.noreply.github.com>

* fix(cli): avoid browser launch in headless login

Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com>

* fix(cli): complete device flow runtime path

Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com>

---------

Signed-off-by: Danny5487401 <64348131+Danny5487401@users.noreply.github.com>
Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com>
Co-authored-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com>
2026-09-17 16:29:20 +08:00

30 lines
1.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AI 变更记录CLI OAuth Device Flow 登录
## 需求背景
SkillHub 服务端已经提供 Device Code 申请、授权轮询和浏览器确认能力,但 CLI `0.1.12`
在没有 API Token 时仍直接返回 `token is required`,无法使用既有的 OAuth 登录链路。
对应社区需求记录在 Issue #856
## 实现内容
- `skillhub login` 未显式提供 Token 时,调用现有 `/api/v1/auth/device/code` 发起授权。
- 展示服务端返回的验证地址和用户码,并在受支持的平台上尝试打开默认浏览器。
- 增加 `--no-open`,支持远程服务器和无图形界面的终端。
- 按服务端返回的 `interval``expiresIn` 轮询 `/api/v1/auth/device/token`,处理等待、拒绝、过期和网络失败。
- 获取 Bearer Token 后先调用 `whoami` 验证,成功后才写入现有配置与凭据存储。
- 保留 `--token``SKILLHUB_TOKEN` 和已存 Token 的兼容行为,供 CI 与自动化使用。
- JSON 模式只输出验证地址、用户码、有效期和浏览器打开状态,不输出 device code 或 access token。
## 安全边界
- 只允许打开 HTTP/HTTPS 验证地址,不通过 shell 拼接 URL。
- access token 不进入标准输出或错误输出。
- Device Flow 失败、拒绝或超时时不更新本地凭据。
- 浏览器打开失败不会中断流程,用户仍可复制终端中的验证地址继续授权。
## 测试策略
- 单元测试覆盖轮询成功、等待、拒绝、过期、非法服务端参数和跨平台浏览器启动。
- 客户端测试验证 Device Flow 使用公开端点且不携带已有 Bearer Token。
- 集成测试覆盖普通输出、JSON 输出、`--no-open`、Token 不泄漏及原有 Token 登录兼容性。