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)(其他使用者的部分,請從「使用者 → 所有使用者」編輯目標使用者)。
- 在下方的「應用程式密碼」(Application Passwords)區塊中,於「新的應用程式密碼名稱」輸入能看出用途的名稱(例:發文用腳本、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 有疑問嗎?本站營運方位於日本,僅以日文回覆。 聯絡我們(日文)