feat: OAuth 登录时记录 API 域名,后续 CLI 调用优先使用登录域名#48
CodeBuddy π
问题: 从 platformURL 推导 loginHost 时,直接在 hostname 前拼接 api.,如果用户传入的 --host 已包含 api. 前缀(如 https://api.cnb.cool),将产生 https://api.api.cnb.cool 这样的错误域名,且该值会被持久化到 token 文件中,后续所有 API 调用都会发往错误地址。 建议: 增加去重检查,避免重复拼接 api. 前缀:
platformURL
loginHost
api.
--host
https://api.cnb.cool
https://api.api.cnb.cool
const platformHost = new URL(cfg.platformURL).hostname; const loginHost = platformHost.startsWith('api.') ? `https://${platformHost}` : `https://api.${platformHost}`;
问题: store.login_host 从本地 token 文件读取后直接返回,未做任何格式校验。token 文件是用户可写的本地 JSON,如果被篡改或损坏(如写入 http://attacker.com),后续所有 API 请求(携带 Authorization: Bearer token)都会发往攻击者控制的地址,导致凭据泄露。 建议: 对 login_host 做基本校验,确保是合法的 HTTPS URL:
store.login_host
http://attacker.com
Authorization: Bearer
login_host
if (store?.login_host) { try { const parsed = new URL(store.login_host); if (parsed.protocol === 'https:' && parsed.hostname.endsWith('.cnb.cool')) { return store.login_host; } } catch { // login_host 格式异常,忽略并回退 } }
如果需要支持自托管域名(非 .cnb.cool 后缀),可改为仅校验 protocol === 'https:' 加合理的 hostname 格式,或维护一个允许列表。
.cnb.cool
protocol === 'https:'
问题: 当 --host 传入非标准 URL(如缺少协议 cnb.cool)时,new URL(cfg.platformURL) 会抛出异常。虽然外层有 try/catch,但错误消息会是 Invalid URL,对用户不够友好。 建议: 在构建 loginHost 前,校验 cfg.platformURL 是否为合法 URL,并给出明确提示:
cnb.cool
new URL(cfg.platformURL)
try/catch
Invalid URL
cfg.platformURL
let platformURL: URL; try { platformURL = new URL(cfg.platformURL); } catch { throw new Error(`--host 参数格式不合法,需包含协议,例如 https://cnb.cool`); } const platformHost = platformURL.hostname;