Gemini CLI 登录失败的排查记录
问题背景
在 macOS (Apple Silicon, macOS Sonoma) 上通过 npm 全局安装了最新版 gemini-cli,准备初始化配置以调用 Gemini 模型进行代码辅助开发。执行登录命令 gemini auth login 时,CLI 应当唤起浏览器完成 OAuth 授权,并将令牌回传至本地守护端口。
问题现象
执行命令后,浏览器正常打开了 Google 授权同意页面,点击“允许”后,浏览器页面显示:
text
无法访问此网站
localhost 拒绝了我们的连接请求。
ERR_CONNECTION_REFUSED同时终端在等待约 90 秒后报错退出:
bash
$ gemini auth login
Waiting for OAuth authentication via browser...
✖ Authentication failed: Timed out waiting for OAuth callback on http://localhost:8085/oauth2callback
Error: EADDRINUSE: address already in use 127.0.0.1:8085环境信息
- 系统:macOS 14.6 (Darwin 23.6.0 arm64)
- Node.js 运行时:v20.14.0
- Shell:zsh 5.9
- 工具版本:
gemini-cliv1.4.2
排查过程
检查端口占用情况: 错误日志明确显示
EADDRINUSE: address already in use 127.0.0.1:8085。使用lsof检查本地8085端口的监听者:bashlsof -i :8085输出结果:
textCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME node 41235 mac 23u IPv4 0x7b1234567890 0t0 TCP localhost:8085 (LISTEN)定位占用进程: 通过
ps命令查看该 PID 对应的详细命令:bashps aux | grep 41235发现是此前测试本地开发时遗留的一个后台测试 Mock Server 脚本常驻未杀掉。
测试端口释放与重试: 终止该残留进程:
bashkill -9 41235再次确认端口已清空:
bashlsof -i :8085
原因
Gemini CLI 默认使用固定端口 8085 启动临时 HTTP 接收服务,以接收 OAuth 重定向回调(http://localhost:8085/oauth2callback)。 由于本地之前运行的 Node.js 进程占用了 8085 端口,导致 CLI 无法成功绑定端口,浏览器授权完成后无法与本地 CLI 握手,最终触发超时和 EADDRINUSE 错误。
解决步骤
杀掉占用
8085端口的陈旧进程:bashkill -9 $(lsof -t -i:8085)(可选推荐)如果该端口常驻被其他服务使用,可以通过环境变量或参数指定授权回调端口(具体看版本支持,或者通过手动复制 Authorization Code):
bashgemini auth login --no-browser # 控制台将输出手动授权 URL,在浏览器打开后将生成的授权码粘回终端重新执行标准登录:
bashgemini auth login
验证结果
重新运行 gemini auth login 后:
- 终端提示
Listening on http://localhost:8085/oauth2callback。 - 浏览器弹出 Google 登录授权界面,点击确认。
- 浏览器显示
Authentication successful! You can close this tab and return to your terminal.。 - 终端显示:text
✔ Authentication credentials saved to ~/.gemini/config.json ✔ Logged in successfully as user@example.com - 运行
gemini --version和gemini prompt "test",成功返回模型生成回复。
经验总结
- CLI 类的 OAuth 流程通常依赖本地临时启动的 HTTP Server。遇到无响应或拒绝连接时,首先排查报错中提到的本地端口占用。
- 若处于受限网络或远程 SSH 会话环境,优先使用
--no-browser或手动粘贴 Token 方案,避免依赖本地回调端口。 - 养成测试完临时本地服务后通过脚本或进程管理工具及时清理的习惯。