logo
0
0
WeChat Login

feat: OAuth 登录时记录 API 域名,后续 CLI 调用优先使用登录域名#48

Merged
created 1 days ago
main
feat/login-host-for-api-domain
Edit
OverviewCommits
1
Files changed
5
AttachmentsTAPD
  • TokenStore 新增 login_host 字段
  • 登录时从 platformURL 推导并保存 API 域名
  • 新增 resolveApiDomain() 工具函数
  • core.ts 和 build-helpers.ts 使用 resolveApiDomain() 替代硬编码
reviewed
client/lib/login.ts

问题: 从 platformURL 推导 loginHost 时,直接在 hostname 前拼接 api.,如果用户传入的 --host 已包含 api. 前缀(如 https://api.cnb.cool),将产生 https://api.api.cnb.cool 这样的错误域名,且该值会被持久化到 token 文件中,后续所有 API 调用都会发往错误地址。
建议: 增加去重检查,避免重复拼接 api. 前缀:

const platformHost = new URL(cfg.platformURL).hostname;
const loginHost = platformHost.startsWith('api.')
  ? `https://${platformHost}`
  : `https://api.${platformHost}`;
client/utils/resolve-api-domain.ts

问题: store.login_host 从本地 token 文件读取后直接返回,未做任何格式校验。token 文件是用户可写的本地 JSON,如果被篡改或损坏(如写入 http://attacker.com),后续所有 API 请求(携带 Authorization: Bearer token)都会发往攻击者控制的地址,导致凭据泄露。
建议: 对 login_host 做基本校验,确保是合法的 HTTPS URL:

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 格式,或维护一个允许列表。

client/lib/login.ts

问题: 当 --host 传入非标准 URL(如缺少协议 cnb.cool)时,new URL(cfg.platformURL) 会抛出异常。虽然外层有 try/catch,但错误消息会是 Invalid URL,对用户不够友好。
建议: 在构建 loginHost 前,校验 cfg.platformURL 是否为合法 URL,并给出明确提示:

let platformURL: URL;
try {
  platformURL = new URL(cfg.platformURL);
} catch {
  throw new Error(`--host 参数格式不合法,需包含协议,例如 https://cnb.cool`);
}
const platformHost = platformURL.hostname;
approved
cnb-p88-1jo38k53dis using the squash method to merge into10e6d1f2
feat: OAuth 登录时记录 API 域名,后续 CLI 调用优先使用登录域名

Successfully merged and closed

branch can be safely deleted
Reviewer
(哪嘟通临时工 )
(晶晶)
(卢嘉辉)
Assignee
None yet
Label
None yet
Participant