VisionClaw 安全实践访问码体系、HMAC 签名 State 与 OAuth 凭据保险库设计【免费下载链接】VisionClawReal-time AI assistant for Meta Ray-Ban smart glasses -- voice vision agentic actions via Gemini Live and OpenClaw项目地址: https://gitcode.com/gh_mirrors/vi/VisionClawVisionClaw 是一款运行在 Meta Ray-Ban 智能眼镜上的实时 AI 助手靠语音 视觉 代理动作完成任务。正因为它能读你的日历、代发邮件、操作第三方应用VisionClaw 安全设计成为整个系统的底座网关层用访问码把守大门用 HMAC 签名的 state 参数防伪造回调把 OAuth 凭据统一锁进按用户隔离的保险库。本文带你从新手视角看懂这三道防线是怎么落地的。上图给出了整体分层眼镜端交给 Gemini Live 做实时感知动作类任务委托给网关OpenClaw。所有敏感凭据都留在网关一侧App 只拿到够用的钥匙——这正是下面三层防护的前提。访问码体系第一道门禁如何工作 首次启动 App你会看到一屏请输入访问码。这里的访问码access code不是作者手动发放的口令而是 App 所指向的那个网关签发的令牌自托管网关在.env里设置GATEWAY_TOKENS你的密钥:你的用户名这个密钥就是你的访问码解析逻辑见 gateway/src/config.ts。App 端提交前会先向网关验证验证通过才解锁打错码会立刻提示未被识别见 AccessCodeScreen.kt。现在的主入口已升级为 Google 登录访问码路径降级为使用自建网关的备选项两条路径共用同一套令牌校验。账号状态机pending / approved / revoked 三级审批网关给每个自注册账号维护一个状态字段访问控制完全由它驱动状态行为pending持有令牌但除/me外所有接口视同无效令牌approved正常放行白名单邮箱域可自动批准revoked全部拒绝凭据不再发放审批接口仅限服务令牌调用普通用户无法枚举他人账号见 gateway/src/auth.ts。令牌只存哈希最多保留 5 个每次登录签发的 bearer token 形如vc- 16 字节随机数服务器只保存它的 SHA-256 哈希原始令牌仅存在于设备端且每个账号最多保留最近 5 个哈希——泄露存储文件也反推不出可用令牌实现见 gateway/src/auth.ts。HMAC 签名 State如何让 OAuth 回调不可伪造 任何 OAuth 流程都绕不开state参数VisionClaw 的做法在 gateway/src/auth.ts 与 gateway/src/connect.ts 中高度一致核心是四步载荷签名把{nonce, userId, appId, ts}做 base64url 编码再用HMAC-SHA256计算 16 字节截断的 MAC拼成body.mac两段式结构。恒定时间比较验证时用timingSafeEqual对比 MAC杜绝时序侧信道攻击。10 分钟 TTLstate 内嵌时间戳过期即作废防止链接被长期截留。签名密钥兜底未配置STATE_SECRET时自动退化为进程内随机密钥——重启会让进行中的登录失效但保证了无配置环境下也不存在无签名 state攻击面见 auth.ts 第 33-35 行。一次性 Nonce 停车机制令牌绝不经过 URL 登录完成后令牌并不走深链接回传那样会留在浏览器历史里而是停在网关内存中App 生成一个 16 字节随机 nonce打开浏览器登录回调成功时网关把新令牌park到该 nonce 下App 端每 2 秒轮询/auth/exchange取回令牌取走即删、二次请求返回 410见 auth.ts 第 308-337 行轮询接口还叠加了每 IP 每分钟 60 次的速率限制防暴力枚举 nonce。连接第三方应用如 Notion、Slack时同样机制与PKCES256结合verifier 只活到回调那一刻以签名 state 为键存取见 connect.ts 第 372-385 行。OAuth 凭据保险库每个用户一个独立金库 保险库按用户隔离凭据按 MCP 地址索引App 连接日历、Gmail、Notion、Slack 时网关换取的 refresh token 并不落在本地 JSON 文件里而是写入 Anthropic Cloud 提供的Vault凭据保险库首次使用即为该用户创建一个专属 vaultvisionclaw-vault-userId见 gateway/src/provision.ts每条凭据以 MCP 服务器 URL 为键重连即替换避免同服务器累积多份过期凭据见 gateway/src/connect.ts后续 token 过期由 Anthropic 侧自动用保险库里的 refresh 配置续期App 与网关都不持有长期刷新逻辑。最小权限的 Scope 设计 申请权限严格遵循够用就好例如 gateway/src/apps.ts 中 Gmail 只申请gmail.readonlygmail.send汇总与代发邮件刻意不申请修改标签、删除邮件的权限日历同样只开放事件读写而非管理权限。敏感配置永不出现在代码库Google/Slack 的 client_id、client_secret 全部来自环境变量未配置时对应应用自动隐藏appAvailable检查LiveKit 的 API secret 只在网关进程内签名 15 分钟有效期的房间 JWTApp 拿到的只是短票见 gateway/src/server.ts本地 store 文件采用先写临时文件再原子 rename的方式落盘避免半写状态见 gateway/src/store.ts。安全实践清单部署自己的 VisionClaw 网关 如果你想自托管一套网关以下配置项与防护一一对应完整说明见 gateway/README.md配置项防护目标GATEWAY_TOKENS访问码体系未设置时启动即告警GATEWAY_SERVICE_TOKEN管理员/worker 专用令牌同时兼任 state 签名密钥STATE_SECRET登录/连接流程的 state 签名密钥显式配置可跨重启保活REGISTRATION_OPENfalse注册总开关kill switch随时关闭新账号AUTO_APPROVE_DOMAINS仅放行白名单邮箱域其余进入人工审批队列给新手的 3 条要点访问码是指向哪个网关、哪个网关说了算自部署时它就是你的.env里那串密钥任何 OAuth 回调都先验 state 再换码state 被篡改或过期都会直接 400凭据集中放在按用户隔离的保险库里代码库与本地文件里找不到可用的 refresh token。这套访问码门禁 签名 state 保险库凭据的组合让 VisionClaw 在替你动日历、发邮件的同时把每把钥匙都锁在了对的地方 。【免费下载链接】VisionClawReal-time AI assistant for Meta Ray-Ban smart glasses -- voice vision agentic actions via Gemini Live and OpenClaw项目地址: https://gitcode.com/gh_mirrors/vi/VisionClaw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考