WordPress REST API 應用程式密碼實務:用 PowerShell 執行安全的只讀稽核
最近在整理 WordPress 網站權限時,碰到一個很常見的狀況:未登入時讀不到 REST API,但網站又不適合為了稽核而放寬公開權限。這時可以使用應用程式密碼,讓指定工具以 WordPress 使用者身分通過驗證。
應用程式密碼是什麼
應用程式密碼不是平常登入後台用的密碼,而是給特定工具使用的獨立憑證。WordPress 會透過 HTTP Basic Authentication 辨識使用者,因此外部程式可以在不開啟匿名管理 API 的情況下讀取受保護資料。這組認證只能走 HTTPS。實務上我也會替不同工具建立不同的應用程式密碼,之後要撤銷時比較容易。先確認目前到底是哪個帳號
不要一開始就讀取文章或嘗試更新內容。先呼叫 users/me,確認 API 收到的帳號是預期的使用者。$pair = "$env:BARRYBLOGS_WP_USERNAME" + ":" + "$env:BARRYBLOGS_WP_APP_PASSWORD"
$encoded = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($pair))
$headers = @{ Authorization = "Basic $encoded" }
$user = Invoke-RestMethod -Uri "https://example.com/wp-json/wp/v2/users/me?context=edit" -Headers $headers -Method Get
$user | Select-Object id, name, slug, roles如果回應是 200,而且 name、slug 與 roles 都符合預期,才表示認證真的成功。401 通常不是文章權限問題,而是帳號、應用程式密碼或 Authorization header 沒有正確送到 WordPress。只讀稽核可以怎麼排
- 先用 GET 讀取 /wp-json/,確認 REST API 與外掛 namespace。
- 用 GET 讀取 /wp-json/wp/v2/users/me?context=edit,確認身分與角色。
- 用 GET 讀取文章與頁面,並用 _fields 限制只回傳需要的欄位。
- 用 GET 讀取 Rank Math、robots.txt、sitemap。
- 用 HEAD 檢查 HTTP 狀態碼與 Content-Type。
$url = "https://example.com/wp-json/wp/v2/posts?per_page=20&_fields=id,date,slug,title,meta"
Invoke-RestMethod -Uri $url -Headers $headers -Method Get_fields 很實用。稽核時通常只需要 ID、標題、網址與 metadata,不需要把文章全文、媒體或其他欄位全部抓回來,也比較不容易在記錄檔中留下不必要的內容。WordPress 標題和 SEO title 不一樣
後台文章列表顯示的是 WordPress 內容標題;Rank Math 的 SEO title 是給搜尋引擎使用的另一個欄位。更新 SEO title 不會改變文章列表中的標題,這也是為什麼後台看起來可能仍是舊標題。要確認 SEO metadata 是否真的生效,我會讀取前台 HTML,檢查 title、meta description、robots 與 canonical,而不是只看編輯器列表。遇到快取不要重複送出更新
如果 API 回應成功,但前台還看到舊的 title 或 robots,先檢查 LiteSpeed Cache 或 WP Rocket。清除對應快取後再驗證;若暫時無法清除,可以用一次性的查詢字串與 Cache-Control: no-cache 取得新 HTML。幾個容易忽略的安全細節
- 不要把應用程式密碼放進網址、Git 儲存庫或公開的命令列紀錄。
- 不要輸出 Authorization header、Base64 字串或完整認證錯誤。
- 每個整合工具使用不同的應用程式密碼。
- 不再使用的應用程式密碼要撤銷。
- 自動化任務預設只做 GET/HEAD;需要寫入時,先明確限制目標與方法。









臉書留言
一般留言