一枚应用密码的六段式记法

WordPress 的应用程序密码在后台生成时,是被拆成六段、每段四个字符显示的,形如 ABCD EFGH IJKL MNOP QRST UVWX。去掉空格后它的长度仍然是 24 位,但肉眼很容易把它误读成两截——前面一截当作用户名,后面一截当作密码。实际上它是一整条凭据,只是一整条。

这次的教训是这个。

手头有一串六段式的口令,习惯性地拆成「用户名 + 密码」两半去试,于是把前四段当成了用户名。于是走 wp-login 报「未在本站点注册」,走 REST 报 rest_not_logged_in,两种报错都是”不认识你”,于是更加确信是密码给错了,或者更糟——认为是 nginx 没有转发 Authorization 头,准备去改服务器配置了。

其实没那么多弯弯绕。把六段拼成 24 位,当成一条完整的应用密码,配上真正的用户名,一次就通。REST 与 XML-RPC 两条路同时返回 200。

项目 说明
用户名 <你的 user_login>,即 user_login,不是 slug
凭据格式 HTTP Basic Auth,用户名:应用密码
口令长度 24 位,6 组 × 4 字符
空格 WordPress 内部会剥离,带不带都行
可用入口 REST(/wp/v2/)与 XML-RPC(/xmlrpc.php)

另外值得记一笔的是那几个报错各自的含义,它们并不等价:

  • rest_not_logged_in:WordPress 根本没收到凭据。注意这不等于「密码错了」——很多排查因此走偏。
  • incorrect_password:凭据收到了,确实对不上。
  • invalid_username:用户不存在,与密码无关。

读报错要先读错误码本身,而不是笼统地把 401 当作「凭据有问题」。一个 401 可能横跨三个完全不同的根因:头没传进来、用户名不存在、密码不对。分清楚这三者,比反复重新生成密码要省事得多。

还有一点:应用密码只在 REST 与 XML-RPC 请求里生效,wp-login 那个网页表单根本不认它。所以「拿应用密码去网页登录失败」这件事,是正常现象,不是密码失效的证据。

整件事最后落到一个很朴素的结论上:六段式的口令就是一条口令,不要再拆。