1. OpenClaw 启动报 unauthorized:gateway password missing 到底卡在哪
你敲下openclaw gateway,终端里日志一行行刷过去,最后停在Gateway listening on 127.0.0.1:18789,看起来一切正常。接着你打开浏览器访问http://127.0.0.1:18789/,Control UI 界面是出来了,但顶部或对话区飘着一行红色报错:unauthorized: gateway password missing (enter the password in Control UI settings)。终端没报错、进程没退出、端口也在监听,可你就是连不上、发不出消息——这是 OpenClaw 新手最容易被绊住的一类"假成功"。
这个报错的本质不是服务没起来,而是认证层没对齐。OpenClaw 的 gateway 在启用密码认证后,会要求每一个接入方(包括它自带的 Control UI)都出示同一个密码。终端启动时你通过命令行参数或配置文件给了 gateway 一个密码,但 Control UI 是独立的前端页面,它并不知道这个密码,需要你在界面里手动填一次。两边对不上,gateway 就回一个unauthorized,前端把它渲染成红色提示。
这篇面向的就是 Control UI 用户:你已经能启动 gateway,但卡在 UI 登录这一步。我会把openclaw.json里gateway.auth.password的配置骨架完整给出来,再带你走一遍"复制密码 → UI 粘贴 → 连接 → 刷新 → 验证对话"的闭环,最后把几个高频坑一次性排掉。全程本地操作,不需要任何额外网络工具,照着做就能恢复服务。
适合谁看:刚装完 OpenClaw、第一次跑 gateway 的人;改了openclaw.json后 UI 突然连不上的人;以及把 OpenClaw 当本地 Agent 跑、需要 Control UI 做对话调试的人。如果你连 gateway 都还没启动成功,那属于另一个问题,本文假设终端已经能正常监听端口。
2. 前置:TaoToken 与 OpenClaw 的模型接入准备
OpenClaw 本身是网关和 Control UI 的壳,真正干活的是背后接的大模型。很多人卡在unauthorized之后,紧接着就会遇到"连上了但模型调不通",所以这里先把模型侧的 Key 准备好,避免来回折腾。
我用的方式是走 TaoToken 的兼容接口。它的 API 地址是https://taotoken.net/api,兼容主流大模型的调用格式,OpenClaw 这类工具只要填 base URL 和 Key 就能接。你需要先去控制台拿一个 API Key,再决定用哪个模型。
拿 Key 的入口在控制台的 API Keys 页面,登录后新建一个即可。如果你还没账号,从官网进:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。注册和拿 Key 的过程不复杂,这里不展开,重点放在配置上。
拿到 Key 之后,OpenClaw 侧一般有两种接法:一种是在openclaw.json的模型配置段里写baseUrl和apiKey;另一种是在 Control UI 的设置里填。两种都行,但建议统一写在配置文件里,方便版本管理和迁移。下面给一个模型段的骨架,字段名以你实际版本为准,核心是baseUrl指向https://taotoken.net/api,apiKey填你刚拿到的值。
{ "models": { "default": { "provider": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoToken密钥", "model": "claude-sonnet-4-5" } } }这里要提醒一句:baseUrl只写到/api,不要自己拼/v1/chat/completions之类的路径,OpenClaw 和兼容层会自己补。模型名按你实际想用的填,不同模型在 Control UI 里的表现差异主要看上下文长度和工具调用能力。如果你打算长期跑编码类 Agent 任务,可以关注 Coding Plan 的额度方案,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ;只是临时验证模型通不通,用模型对话页更快:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
模型侧准备好,回到 gateway 认证这条主线。记住一个原则:gateway 密码和模型 API Key 是两码事。前者管的是"谁能连上这个本地网关",后者管的是"网关拿什么去调模型"。unauthorized: gateway password missing说的是前者,别把 TaoToken 的 Key 填到 gateway 密码框里,那只会让你更困惑。
3. 可复制配置:openclaw.json 的 gateway 密码字段骨架
现在进入正题。先找到你的openclaw.json。默认位置通常在用户目录下的.openclaw/openclaw.json,也可能是项目根目录,取决于你启动时的工作目录。用编辑器打开,定位到gateway这一段。
一个能触发unauthorized: gateway password missing的典型配置长这样:gateway里开了认证,但密码字段缺失或为空。修复的核心就是补上auth.password。下面给一份完整的可复制骨架,你按自己的端口和密码替换即可。
{ "gateway": { "host": "127.0.0.1", "port": 18789, "auth": { "mode": "password", "password": "my-local-gateway-pass-2024" } } }几个字段逐个说清楚:
host建议保持127.0.0.1,只监听本机,避免把网关暴露到局域网。port默认18789,如果你改过,UI 地址也要跟着改。auth.mode设为password表示启用密码认证;如果你设成none,理论上不会报这个错,但也不安全,不推荐。auth.password就是关键,它必须是一个非空字符串,且要和你在 Control UI 里填的完全一致。
密码怎么设?别用123456这种,也别用带特殊符号导致 JSON 转义出错的字符。建议用字母加数字的组合,长度 16 位以上。上面示例里的my-local-gateway-pass-2024只是占位,你换成自己的。注意 JSON 里字符串要用双引号,密码里如果含"或\需要转义,省事的做法是避开这两个字符。
如果你之前是用命令行参数启动的,比如openclaw gateway --auth password,那密码可能是启动时随机生成或从环境变量读的。这种情况下,配置文件里可能没有明文密码,你需要确认密码来源。最稳妥的做法是:统一在openclaw.json里写死密码,启动命令不再带--auth相关参数,避免两处配置打架。改完配置后,先别急着启动,用编辑器自带的 JSON 校验或python -m json.tool openclaw.json检查一下语法,一个多余的逗号就能让 gateway 读不到密码。
python -m json.tool openclaw.json这条命令能正常输出格式化后的 JSON,说明语法没问题;如果报Expecting property name之类,就是括号或逗号错了,先修好再往下走。
4. 重启验证与 Control UI 登录确认
配置改完,接下来是重启和验证。顺序很重要:先停掉旧进程,再启动新的,最后去 UI 填密码。
第一步,停掉正在跑的 gateway。如果你是在前台终端跑的,直接Ctrl+C。如果是后台或用了进程管理,找到进程杀掉:
ps aux | grep openclaw kill <PID>确认端口释放,可以顺手查一下:
lsof -i :18789没有输出说明端口空了。第二步,重新启动:
openclaw gateway观察终端日志,应该能看到 gateway 正常监听,且不再有认证相关的警告。如果日志里出现auth mode: password之类的字样,说明配置被读到了。
第三步,打开 Control UI:http://127.0.0.1:18789/。这时候红色报错可能还在,别慌,因为 UI 还没拿到密码。找到设置里的【密码(不存储)】输入框——不同版本位置略有差异,一般在设置面板或连接配置区。把openclaw.json里auth.password的值原样复制过去,注意不要多复制空格或换行。粘贴后点击【连接】,再点【刷新】。
如果一切正常,红色报错会消失,界面进入可用状态。这时候发一条测试消息,比如"你好,做个自我介绍",看是否有正常回复。有回复,说明 gateway 认证和模型调用两条链路都通了。如果报错消失但消息发不出去,那问题就转移到模型配置上,回到第 2 节检查baseUrl和apiKey。
这里有个细节:Control UI 的密码框标注"不存储",意味着刷新页面或重开浏览器后可能需要重新填。这是设计如此,不是 bug。如果你嫌麻烦,可以在浏览器里保存该站点的密码,或者确认你的 OpenClaw 版本是否支持会话保持。但无论如何,配置文件里的密码才是源头,UI 里填的只是本次会话的凭证。
验证成功的标志很明确:红色unauthorized消失 + 能正常对话。两个都满足,这条报错就算彻底解决了。
5. 本篇常见错排查:密码对了还是 unauthorized 怎么办
即使按上面做了,还是有人会卡住。下面这几个是我见过最高频的坑,逐个排。
坑一:配置文件改了但没重启。OpenClaw 的 gateway 一般在启动时读取openclaw.json,运行中改文件不会热加载。你改完密码必须重启进程,否则读的还是旧配置。判断方法:重启后看日志里有没有打印当前 auth 模式。
坑二:命令行参数覆盖了配置文件。如果你启动时带了--auth password或类似参数,它可能优先于配置文件,导致你改openclaw.json不生效。解决办法是启动命令保持干净,只写openclaw gateway,所有认证配置都放文件里。
坑三:密码里有隐藏字符。从配置文件复制时,容易带上行尾空格或不可见字符。UI 里粘贴后,gateway 比对失败,依旧unauthorized。建议手动重新输入一遍,或者复制后用编辑器查看是否有异常空白。
坑四:UI 地址或端口不对。如果你改过gateway.port,但浏览器还开着旧的18789,那连的是另一个进程或根本连不上。确认 UI 地址和配置文件里的port一致。
坑五:把模型 Key 填进了 gateway 密码框。前面强调过,这两个不是一回事。gateway 密码是你自己在openclaw.json里设的,TaoToken 的 Key 是给模型用的。填错了自然过不了认证。
坑六:JSON 语法错误导致整段配置被忽略。一个多余的逗号会让解析失败,gateway 可能回退到默认无密码模式或直接报别的错。用第 3 节的json.tool先校验。
如果以上都排除了还是不行,可以打开浏览器开发者工具看 Network 面板,找到返回401的那个请求,看响应体里的具体错误信息。unauthorized: gateway password missing和unauthorized: invalid password是两种不同情况,前者是没提供,后者是提供了但不匹配。对症下药,前者检查 UI 有没有填,后者检查两边值是否完全一致。
6. 接入与排障的后续入口
走到这里,unauthorized: gateway password missing应该已经解决了。如果你在配置模型或调 API 时遇到问题,比如 Key 无效、模型名不对、请求超时,可以直接去 API Keys 页面核对密钥状态,或者翻接入文档确认参数格式。这两个入口分别是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 和 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
如果你只是想快速验证某个模型能不能用、回复质量如何,不必折腾 OpenClaw,直接在模型对话页试更省事:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。而如果你打算把 OpenClaw 长期当编码 Agent 用,频繁跑任务,那 Coding Plan 的额度方案会比按量更划算,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
最后留一个我自己的习惯:每次改完openclaw.json,先跑python -m json.tool校验,再重启,再去 UI 填密码,三步固定下来,基本不会再被unauthorized绊住。密码统一放配置文件、启动命令保持干净,这两条守住,后面换模型、加 Agent 都省心。