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 的站点上,个人资料页面中不会显示这个栏位。因为那样会通过未加密的通信发送密码。

在后台生成

  1. 打开“用户 (Users) → 个人资料 (Profile)”(其他用户的,则从“用户 → 所有用户”中编辑对应的用户)。
  2. 在下方的“应用程序密码”栏位中,在“新应用程序密码名称”里填入能看出用途的名称(例:发布用脚本、Zapier)。
  3. 点击“添加新应用程序密码”(根据版本不同,也可能显示为其他措辞)。
  4. 记下显示出来的 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 有疑问?本站运营方位于日本,仅以日语回复。 联系我们(日语)

お気軽にご相談ください

お見積りへ お問い合わせへ
▲