问题现象
用户在使用 Gateway 服务时,突然遇到以下错误:
gateway connect failed: Error: unauthorized: device token mismatch (rotate/reissue device token)
RPC probe: failed
gateway closed (1008): unauthorized: device token mismatch (rotate/reissue device token)
关键信息:
- Gateway 服务正在运行(pid 76036)
- 端口 18789 正常监听
- 但 CLI 无法连接,报错 "device token mismatch"
问题本质
Gateway 的认证架构
Gateway 采用 Token-based 认证机制:
┌─────────────┐ Token A ┌─────────────────┐
│ CLI 工具 │ ◄────────────────► │ Gateway 服务 │
│ (~/.gateway)│ │ (18789 端口) │
└─────────────┘ └─────────────────┘
│ │
│ 设备令牌 (Device Token) │
└──────────────────────────────────┘
设备令牌(Device Token)用于验证 CLI 客户端与 Gateway 之间的身份。当两者持有的令牌不一致时,就会出现 "mismatch" 错误。
令牌不一致的常见原因
| 场景 | 原因 |
|---|---|
| Gateway 重启 | 服务重启后生成新令牌 |
| 配置变更 | 修改配置文件后令牌重新生成 |
| 多用户环境 | 不同用户启动的 Gateway 使用不同令牌 |
| 权限问题 | 令牌文件权限变更导致读取失败 |
| 版本升级 | 新版本可能改变令牌生成逻辑 |
解决方案
方案一:重启 Gateway(推荐)
最直接的解决方式是重新生成并同步令牌:
# 1. 停止现有 Gateway
gateway stop
# 2. 确认进程已终止
ps aux | grep gateway
# 3. 清理可能的残留
rm -f ~/.gateway/.gateway-token
# 4. 重新启动
gateway start
# 5. 验证状态
gateway status

