2026年11月12日
2026年11月12日
WordPress 应用程序密码是什么|生成与删除步骤及在 REST API 中的用法
本文是日语原文的本地化版本。 阅读日语原文
应用程序密码(Application Passwords)是 WordPress 5.6 新增的功能,是专门交给 REST API 和外部工具使用的密码。这样就不必告诉对方真正的登录密码,可以按工具分别生成,并且只撤销不再需要的那一个。本文说明可使用的条件、生成与删除的方法(后台、WP-CLI、PHP)、在 REST API 中的用法,以及不顺利时的检查要点。内容是 2026 年 11 月对照 WordPress 开发者文档和源代码确认过的。
应用程序密码能做什么、不能做什么
- 可用于 REST API 和 XML-RPC 的认证。在 REST API 中,通过 Basic 认证发送用户名和应用程序密码。
- 不能用于登录后台(wp-login.php)。它不是给人登录用的,而是给程序和工具用的。
- 权限与生成它的用户相同。如果由管理员生成,持有该密码的工具就能进行与管理员相同的操作。如果只想让对方负责发布文章,请创建作者或编辑的用户,并用该用户生成。
- 可以逐个撤销。最后一次使用的时间和 IP 地址也会被记录。
可使用的条件
应用程序密码默认只能在 HTTPS 站点,或环境类型为 local 的站点上使用。WordPress 的判断如下(wp_is_application_passwords_supported())。
return is_ssl() || 'local' === wp_get_environment_type();
在仍使用 HTTP 的站点上,个人资料页面中不会显示这个栏位。因为那样会通过未加密的通信发送密码。
在后台生成
- 打开“用户 (Users) → 个人资料 (Profile)”(其他用户的,则从“用户 → 所有用户”中编辑对应的用户)。
- 在下方的“应用程序密码”栏位中,在“新应用程序密码名称”里填入能看出用途的名称(例:发布用脚本、Zapier)。
- 点击“添加新应用程序密码”(根据版本不同,也可能显示为其他措辞)。
- 记下显示出来的 24 个字符的密码。离开这个页面后就不会再显示。
密码会像 abcd EFGH 1234 ijkl MNOP 6789 这样每 4 个字符加一个空格来显示,但有没有空格都可以通过认证。
撤销时,在同一栏位的列表中,点击对应行的撤销按钮。也可以用“撤销所有应用程序密码”一次性全部撤销。
用 WP-CLI 生成、确认、删除
# 生成(如果只显示密码,就加 --porcelain)
wp user application-password create admin "发布用脚本" --porcelain
# 显示列表(uuid 用于删除)
wp user application-password list admin --fields=uuid,name,created,last_used,last_ip
# 删除其中一个
wp user application-password delete admin 6633824d-c1d7-4f79-9dd5-4586f734d69e
# 删除该用户的全部密码
wp user application-password delete admin --all
admin 的部分,用户名、电子邮件地址、用户 ID 都可以指定。uuid 请换成 list 的结果中显示的值。
用 PHP 生成、确认、删除
从插件等中处理时,使用 WP_Application_Passwords 类。
<?php
$user_id = 2; // 目标用户的 ID
// 生成。成功后会返回 [明文密码, 保存的信息] 这样的数组
$result = WP_Application_Passwords::create_new_application_password(
$user_id,
array( 'name' => '发布用脚本' )
);
if ( is_wp_error( $result ) ) {
error_log( $result->get_error_message() );
} else {
list( $password, $item ) = $result;
// $password 是明文。只有这一次能获取到,所以要用安全的方式交给使用者
error_log( 'created: ' . $item['uuid'] );
}
// 获取列表(name、uuid、created、last_used、last_ip 等)
foreach ( WP_Application_Passwords::get_user_application_passwords( $user_id ) as $item ) {
error_log( $item['name'] . ' ' . $item['uuid'] );
}
// 删除其中一个
// WP_Application_Passwords::delete_application_password( $user_id, $uuid );
保存的只有哈希化的值,明文密码只能在生成的那一瞬间取出。
在 REST API 中使用
在 curl 中,用 -u 用户名:应用程序密码 添加 Basic 认证。首先确认能否以认证后的用户身份返回自己的信息。
# 确认认证是否成功(返回自己的用户信息即为成功)
curl -u "admin:abcd EFGH 1234 ijkl MNOP 6789" https://example.com/wp-json/wp/v2/users/me
# 创建一篇草稿文章
curl -u "admin:abcd EFGH 1234 ijkl MNOP 6789" \
-X POST https://example.com/wp-json/wp/v2/posts \
-H "Content-Type: application/json" \
-d '{"title":"测试文章","content":"正文","status":"draft"}'
从 PHP 调用其他 WordPress 站点的 REST API 时,需要自己构造 Authorization 头。
<?php
$response = wp_remote_get(
'https://example.com/wp-json/wp/v2/users/me',
array(
'headers' => array(
'Authorization' => 'Basic ' . base64_encode( 'admin:abcd EFGH 1234 ijkl MNOP 6789' ),
),
)
);
if ( ! is_wp_error( $response ) ) {
error_log( wp_remote_retrieve_response_code( $response ) );
}
示例中的密码只是样例。实际的密码不要直接写进代码,请放在环境变量或配置文件等不会公开的地方。
无法认证时的检查要点
| 症状 | 需要确认的内容 |
|---|---|
| 个人资料中没有“应用程序密码”栏位 | 站点是否已经是 HTTPS。是否被过滤器或插件停用了 |
/wp/v2/users/me 返回 401 |
用户名是否正确(是登录名,而不是显示名称)。密码是否已被撤销 |
| 明明应该正确,却被当作未登录 | 服务器可能没有把 Authorization 头传给 PHP。在 Apache 中,请确认 WordPress 的 .htaccess 里的 RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 这一行是否还在 |
| 只有部分 URL 失败 | 安全类插件或 WAF 是否限制了 REST API |
REST API 错误的总体情况,在“REST API 错误的修复方法”中有说明。
停用应用程序密码
在不使用的站点上,可以把这个功能整体停用。把它写进主题的 functions.php,或自己写的插件中。
<?php
// 在整个站点停用
add_filter( 'wp_is_application_passwords_available', '__return_false' );
只允许特定用户使用时,请使用按用户的过滤器。下面的示例,只允许拥有管理员权限(manage_options)的用户使用。
<?php
add_filter( 'wp_is_application_passwords_available_for_user', function ( $available, $user ) {
return $available && user_can( $user, 'manage_options' );
}, 10, 2 );
限制对 REST API 本身的访问的方法,请参阅“限制对 REST API 的访问的方法”。
运维的注意点
- 为每个工具生成不同的密码,并用名称标明用途。这样一旦泄露,只需撤销该工具的那一个。
- 不再使用的工具,要立刻撤销它的密码。在列表中,最后使用时间很久以前的,可能已经不再使用。
- 重新审视是否真的需要把管理员的密码交给外部服务,并使用只拥有必要权限的用户来生成。
关于 WordPress 有疑问?本站运营方位于日本,仅以日语回复。 联系我们(日语)