Skip to content

fix: 修复账户登录、导入与初始化的缺陷 - #1

Merged
Mag1cFall merged 1 commit into
mainfrom
fix/account-login-import
Nov 10, 2026
Merged

Mag1cFall merged 1 commit into
mainfrom
fix/account-login-import

Conversation

@Mag1cFall

Copy link
Copy Markdown
Owner

问题

  • 刷新账户池时相邻账户的初始化相隔 1–3 秒,排在后面的账户在等待期间被删除后,进程以空指针 panic 退出
  • 认证失败、需要验证等异常账户以新的 refresh token 再次登录后按冷启动序列初始化,不发登录序列的请求
  • 账户 JSON 导入时换取 token 与读取邮箱的请求都经 PROXY 的第一项,文件中的账户代理不参与也不校验
  • 官方客户端的企业账户凭据(auth_method 为 gcp)被导入为个人账户,刷新 token 用的是个人账户的 OAuth 客户端;企业账户切换到官方客户端时写入的是个人账户凭据
  • 切换官方客户端账户时凭据写入失败,官方客户端保持关闭
  • Linux 与 macOS 上 login --code 停在授权码提示时按 Ctrl+C 不退出
  • login --remote 登录前请求所用的设备档案不随 token 上传,远程服务为账户另生成档案
  • 删除账户的 5 秒撤销期内刷新或关闭页面,删除不发生
  • 反向代理改写 Host 时管理请求返回的 403 不写原因;账户文件损坏时启动错误不含文件路径;管理端修改账户资料与上游状态写回并发时可能丢失一次修改

修复

  • 初始化开始时账户已不在账户库中则不初始化,刷新账户池时跳过没有 token 的账户
  • 已有账户以新的 refresh token 写入时清空 project,账户随后按登录序列初始化;token 与资料在账户库的一次加锁中写入
  • 账户 JSON 导入保持 4 个账户并发,请求经导入项的账户代理发出,没有时用代理池按项中邮箱绑定的代理;文件中的代理按账户代理的规则校验
  • 官方客户端的 gcp 凭据导入为企业账户,邮箱取 id_token_email,wif_provider 写入账户;企业账户切换时写 auth_method: gcp、邮箱与 provider,与官方客户端登录后、选择许可证前保存的凭据相同
  • 账户 JSON 的导出项带 auth_method 与 wif_provider,导入时沿用
  • 刷新 token 的 OAuth 客户端按官方客户端 getOAuthConfig 的规则选择:有 WIF provider 时用 WIF 客户端,以 Google 账户登录的企业账户用 Google Cloud 客户端,其余用个人客户端
  • 凭据写入失败时照常重新打开官方客户端并返回写入的错误
  • 授权码提示在 ctx 结束时返回;login --remote 把设备档案与 token 一并上传,远程的新账户沿用该档案
  • 撤销期内页面关闭或刷新时立即发出删除
  • 同源校验的 403 写出 Origin 与 Host,README 写明反向代理原样转发 Host;账户文件的 JSON 错误带文件路径;管理端修改账户资料改用账户库的加锁修改
  • 整理:账户库加入按 ID 查询,替换管理端与服务中的遍历查找;登录、导入与配对添加账户都经同一个写入函数;账户之间的间隔合并为一个函数

测试

  • 删除等待初始化的账户(真实实例,两个账户,服务开始监听即删除后一个):修改前进程在 3 秒内以空指针 panic 退出,修改后进程存活、前一个账户就绪
  • 异常账户以新的 refresh token 再次导入(真实实例,token 端点注入 invalid_grant 使账户为 error):修改前初始化为 tokeninfo 与 daily loadCodeAssist 开始的冷启动序列,修改后为 prod loadCodeAssist 开始的登录序列
  • 全局 PROXY 不可达时导入带可用代理的账户(真实实例):修改前以连接被拒失败,修改后换取 token 与 userinfo 经该账户的代理发出,776 ms 导入成功;同一次导入的两个账户仍并发换取 token,请求相隔 10 ms
  • login --remote 配对上传(真实实例):修改前账户的 installation_id 与上传的不同,修改后设备档案与上传的相同
  • login --code 在 Linux 上收到 SIGINT:修改前 3 秒后仍在运行,修改后以 context canceled 退出
  • 撤销期内刷新与关闭页面(无头 Chrome):修改前两种情形都不发 DELETE,修改后各发一次
  • 带外站 Origin 的管理请求:修改后 403 的消息写出 Origin 与 Host
  • 企业凭据(离线测试,凭据格式与客户端选择规则取自官方 language_server 的静态分析,没有企业账户的真实请求):gcp 凭据导入为企业账户并沿用邮箱与 provider、企业账户写回 gcp 凭据;企业账户导出再导入时以 Google Cloud 客户端换取 token;三种账户刷新 token 时表单中的 client_id 与密钥各自对应;撤销对应修改后三项测试失败
  • 离线测试:等待初始化的账户被删除后刷新照常结束、再次登录清空 project、账户文件错误带路径 3 项在修改前失败、修改后通过;导入代理、授权码提示、上传正文与调度中的账户换 refresh token 后的登录序列 4 项在撤销对应修改后失败
  • 账户、服务、登录、命令行、代理池、账本与伴随请求 9 个回归组通过,go vet、前端类型检查与 lint 通过

- 修复等待初始化的账户被删除后服务以空指针崩溃的问题
- 让换了 refresh token 的再次登录清空项目,异常账户重新登录后按登录序列初始化
- 让账户 JSON 导入的请求经该账户的代理发出,并校验文件中的代理
- 支持导入与切换官方客户端的企业账户凭据,账户 JSON 保留认证方式,按认证方式与 WIF provider 选择刷新 token 的客户端
- 让 login --remote 一并上传登录前的设备档案,授权码提示在 Ctrl+C 时退出
- 让切换官方客户端账户在凭据写入失败时照常重新打开官方客户端
- 让撤销期内关闭或刷新页面时立即发出删除,同源校验的错误写出 Origin 与 Host
- 把账户资料的修改放进账户库的一次加锁,账户文件损坏时错误写出文件路径
- 更新开发文档、协议文档与 README 中登录、导入、切换、配对与反向代理的说明

Co-authored-by: Claude Fable 5.2 <noreply@anthropic.com>
@Mag1cFall
Mag1cFall merged commit e460ccb into main Nov 10, 2026
15 checks passed
@Mag1cFall
Mag1cFall deleted the fix/account-login-import branch November 10, 2026 11:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant