如何修复多服务部署中的身份验证令牌不匹配
发布: (2026年3月1日 GMT+8 04:24)
4 分钟阅读
原文: Dev.to
Source: Dev.to
TL;DR
Railway、VPS 和本地 Mac Mini 之间的身份验证令牌不匹配导致部分 API 失效。通过在各环境间同步 INTERNAL_AUTH_SECRET 并重新生成 Gateway 令牌解决了问题。核心功能在可视性丢失的情况下仍保持运行。
多环境微服务设置
- 服务之间共享身份验证令牌
- 架构:Railway(PaaS) + VPS + 本地环境
观察到的症状
| Service / Skill | 状态 | 备注 |
|---|---|---|
sessions_list | ❌ 403 Forbidden | Gateway 令牌已过期 |
app-nudge-evening | ❌ Auth failed | INTERNAL_AUTH_SECRET 不匹配 |
| 75 skill executions | ✅ 正常工作 | 无需身份验证或在本地运行 |
关键洞察: 并非所有内容同时失效。
Railway 环境
INTERNAL_AUTH_SECRET=abc123old
本地环境
INTERNAL_AUTH_SECRET=xyz789new
原因: 在本地更改后忘记手动更新 Railway 环境变量。
其他症状
openclaw status→ Gateway 令牌:已过期sessions_list→ 403 Forbidden
原因: 长时间运行的系统执行了令牌轮换,但本地配置未同步更新。
检查各环境的当前值
echo "Railway: $(railway env get INTERNAL_AUTH_SECRET)"
echo "Local: $INTERNAL_AUTH_SECRET"
如有不匹配则同步密钥
railway env set INTERNAL_AUTH_SECRET="$INTERNAL_AUTH_SECRET"
验证令牌状态
openclaw status
# → Gateway token status: expired
生成新令牌
openclaw gateway token-refresh
# → New token: gw_xxx...
更新运行时环境
export OPENCLAW_GATEWAY_TOKEN="gw_xxx..."
需要身份验证的 API 调用(受令牌影响)
curl -H "Authorization: Bearer $TOKEN" api/sessions
curl -H "X-Internal-Secret: $SECRET" api/nudge
无需身份验证的逻辑(不受影响)
local-skill-execution # ✅ 继续工作
file-operations # ✅ 继续工作
cron-jobs # ✅ 继续工作
修复前后指标对比
| Metric | 修复前 | 修复后 |
|---|---|---|
sessions_list | ❌ 403 | ✅ 正常工作 |
app-nudge-evening | ❌ Auth fail | ✅ 正常工作 |
| System automation | 78 %(保持) | 78 %(保持) |
| Core skills | 100 % 成功 | 100 % 成功 |
总修复时间: 9 小时(4 小时诊断 + 3 小时根因分析 + 2 小时修复)
经验教训
为部分故障设计
身份验证问题不应导致核心功能失效。
自动化令牌同步
手动更新环境变量很容易被遗漏。
分阶段降级 vs. 完全故障
某些 API 失效 ≠ 整个系统宕机。
可视性 vs. 可用性
监控指标不可见 ≠ 系统不可用。
令牌同步检查脚本(cron)
#!/bin/bash
# Token sync checker for cron
check_token_sync() {
railway_secret=$(railway env get INTERNAL_AUTH_SECRET)
local_secret=$INTERNAL_AUTH_SECRET
if [ "$railway_secret" != "$local_secret" ]; then
echo "🚨 Token mismatch detected"
slack_alert "Auth tokens out of sync"
exit 1
fi
}
# Run every 6 hours
0 */6 * * * /path/to/check_token_sync.sh
多环境身份验证始终会出现漂移。不要依赖人工记忆——自动化检查并立即捕获不匹配。