web-dev-qa-db-ja.com

ヘッドレスフロントエンドからREST API経由でドラフト投稿を取得できません

Wordpress on _v5.4.0_)のヘッドレスインストールを行っています。APIのURLに直接アクセスする場合、フロントエンドはdraftステータスの投稿を取得できません。データは問題なく返されます。これはcookie/auth関連であると想定しています。注意してください。バックエンドからnonce値を動的に取得し、引数のためにここに完全な文字列を表示しています。ここに私の設定を示しますと応答のスクリーンショット:

リクエストURL:_http://wordpress.test/wp-json/wp/v2/pages/19060?wpnonce=23c01b3b12&_embed=true_

次のように_isomorphic-unfetch_を使用してフロントエンドで呼び出されます(axiosでも試行されます)。

_fetch("http://wordpress.test/wp-json/wp/v2/pages/19060?wpnonce=23c01b3b12&_embed=true", {
  credentials: "include"
})
_

これは機能していないフロントエンドからのリクエスト/レスポンスです(これはすべてのpublishedコンテンツに対して機能しますdoes):

このボディで:

_{
  "code":"rest_forbidden",
  "message":"Sorry, you are not allowed to do that.",
  "data":{
  "status":401
  }
}
_

データに直接アクセスしようとすると、wpnonceクエリパラメーターの下線に応じて2つの異なる応答が表示されます。

これは機能し(__wpnonce_を使用)、適切なJSONデータを返します。

_http://wordpress.test/wp-json/wp/v2/pages/19060?_wpnonce=23c01b3b12&_embed=true_

詳細:

これは(wpnonceを使用して)行いません:

_http://wordpress.test/wp-json/wp/v2/pages/19060?wpnonce=23c01b3b12&_embed=true_

詳細:

フロントエンドと同じ応答エラーを返します。

_{
  "code":"rest_forbidden",
  "message":"Sorry, you are not allowed to do that.",
  "data":{
  "status":401
  }
}
_

編集:

ここで言及されている_X-WP-Nonce_ヘッダーも試しました( https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/ )。認識されていないようです:

_fetch(postUrl, {
  credentials: "include",
  headers: {
    "X-WP-Nonce": wpnonce
  }
})
_

_{"code":"rest_cookie_invalid_nonce","message":"Cookie nonce is invalid","data":{"status":403}}
_

編集2:

WPおよび新しいベアボーンフロントエンド(html + jquery)のクリーンインストールで、同じ問題が発生しています。ただし、プレビューリンクを生成するときにナンスは有効ですが、無効ですときWPは_rest_cookie_check_errors_を使用して検証を試みます。同じアクションの同じナンス(_wp_rest_)が検証に失敗する方法は?

RESTリクエストでCookieが見つからないため、wp_get_session_token()が失敗しているようです。( https://core.trac.wordpress.org/browser /tags/5.4/src/wp-includes/pluggable.php#L214nonceがCookieを必要としないのではないですか?クロスドメインCookieパスに問題がある可能性がありますか?

XHRで資格情報を送信しています。これが私のフロントエンドテストコードです。

_// GET page with Nonce header
$.ajax({
  url: postUrl,
  method: "GET",
  xhrFields: {
    withCredentials: true
  },
  beforeSend: function(xhr) {
    xhr.setRequestHeader("X-WP-Nonce", wpnonce);
    xhr.setRequestHeader("Content-Type", "application/json");
  }
})
_

2つの質問:

  1. 主に、フロントエンドからナンス値を使用してドラフト投稿データを取得するにはどうすればよいですか?
  2. なぜ世界で__wpnonce_/wpnonceクエリ変数がフロントエンドとバックエンドで異なる結果を表示するのですか?
2
theLucre

わかりましたので、技術的には、フロントエンドがdraft値のみを使用してホストされている外部ドメインからnonceステータスの投稿にアクセスできなかった問題を解決しませんでした。私の推測では、logged_in外部のAJAX=リクエスト中にnonceの値を確認するために、フロントエンド側でCookieが設定されていない/読み取れませんでした。

つまり、WP REST APIプラグイン( https://github.com/Tmeister/wp- api-jwt-auth )そして、ローカルストレージにトークンを設定するには、管理者がフロントエンドのプレビューページに一度ログインする必要があります。

1
theLucre