私のサイトでは、クライアントがWordPressサイトの詳細を送信するためのフォームが1つあります。そのフォームにWordPressの管理URL、ユーザー名、パスワードを入力してください。フォームを送信する前に、ログイン情報が有効であることを確認したいです。どうやってそれをするの?
WordPress REST APIを使用してやる方法はありますか?
誰かが私を助けてください知っているならありがとう!
ユーザー名とパスワードを取得するのは恐ろしいアイデアであり、ユーザーが実際に同意しないことを望みますが、それを超えてJSからそれを行うというあなたのアイデアはCORSのため失敗します。つまり、AJAXサーバーにログインして、サーバーにログインを試行させると、すぐにブルートフォース攻撃者としてフラグが立てられ、主要なセキュリティプレーヤーはすべて自動的にリクエストをブロックします。
ユーザー名とパスワードを必要としないようにソフトウェアを再設計する必要があります。おそらく、代わりにoauth2などを使用してください。 oauth2があなたの状況に当てはまらない場合は…。
まず、以下のコードが失敗する理由はたくさんあります。どこでも機能するシステムを持つ方法はありません。これは、さまざまなセキュリティプラグインがさまざまな概念を導入しているためです。
そうは言っても、このコードはWordfence(それほど厳格ではない設定を有効にしたもの)を有効にしたものと同様に普通のインストールでもうまくいきました。
wp_remote_post()
はこの関数の重要な機能です。それはあなたがPOSTリクエストをリモートホストに送ることを可能にします - あなたがログインをチェックしたいならまさにあなたが望むものです。
function WPSE_test_remote_login($url, $username, $password) {
// remove trailing slash if it exists
$base = rtrim($url, '/');
// login url
$url = $base . '/wp-login.php';
$args = [
// the inputs that get POSTed
'body' => [
'log' => $username,
'pwd' => $password,
'wp-submit' => 'Submit',
'redirect_to' => $base . '/wp-admin/',
'testcookie' => 1,
],
];
// make the actual request
$response = wp_remote_post($url, $args);
// only one cookie? then failed login
if ( ! is_array($response['headers']['set-cookie'])) {
return false;
}
// if a cookie that contains wordpress_logged_in is set
// the login was successful
foreach ($response['headers']['set-cookie'] as $cookie) {
if (stripos($cookie, 'wordpress_logged_in') !== FALSE) {
return true;
}
}
return false;
}
私は私のローカル環境でこれを試しました、あなたがあなたのブラウザでwp-login.phpにアクセスするならば通常送られる必要なフィールドを得ることができます。
それから私は$result
をチェックして、正しいパスワードと間違ったパスワードの違いを比較しました。 ログイン失敗 の場合、$response['headers']['set-cookie']
は次のようになりました
string(45) "wordpress_test_cookie=WP+Cookie+check; path=/"
またはこれ
array(3) { [0]=> string(128) "__cfduid=df131...; expires=Sun, 21-Apr-19 12:35:00 GMT; path=/; domain=.example.com; HttpOnly" [1]=> string(100) "wfvt_144...=5ad...; expires=Sat, 21-Apr-2018 13:05:00 GMT; Max-Age=1800; path=/; HttpOnly" [2]=> string(74) "wordpress_test_cookie=WP+Cookie+check; path=/; domain=.example.com; secure" }
しかし、 ログイン成功 はこれらのクッキーを返しました
array(4) { [0]=> string(45) "wordpress_test_cookie=WP+Cookie+check; path=/" [1]=> string(209) "wordpress_852...=test%7C15...; path=/wp-content/plugins; HttpOnly" [2]=> string(199) "wordpress_852...=test%7C15...; path=/wp-admin; HttpOnly" [3]=> string(201) "wordpress_logged_in_852...=test%7C15...; path=/; HttpOnly" }
wordpress_test_cookie
は常に設定されることがわかります。ただし、wordpress_logged_in_852...
は成功したログインに対してのみ設定されていました。したがって、これが存在する場合、資格情報は正しいと判断できます。
カスタムAPIルートなしでこれを達成する方法はありません。ただし、そのサイトでテーマを編集したりプラグインをインストールしたりできる場合は、もちろんそのようなルートを登録することもできます(または代わりにAJAXを使用することもできます)。
それでは、REST APIを使ってこれを行いましょう...
function my_register_api_hooks() {
register_rest_route(
'my_namespace', '/check-login/',
array(
'methods' => 'POST',
'callback' => 'my_api_check_login_callback',
)
);
}
add_action( 'rest_api_init', 'my_register_api_hooks' );
function my_api_check_login_callback($request){
$user = wp_authenticate_username_password(null, $request['username'], $request['password']);
if ( is_wp_error($user) ) {
return array('error' => $user, 'user' => false);
}
return array('error' => false, 'user' => $user->ID);
}
username
とpassword
を含むPOSTリクエストをhttp://example.com/wp-json/my_namespace/check-login/
に送信すると、次のようなJSONが得られます。
{
"error": false,
"user": 1
}
1
は、指定された資格情報で見つかったユーザーのIDです。
{
"error": ..., <- this will contain error messages
"user": false
}
このコードはユーザーの資格情報が正しいかどうかだけを確認することに注意する必要があります。ユーザーはログインしません。
そうすれば、あなた自身のルートを登録する方法はなく、RESTを使ってユーザーの資格情報をチェックする方法はありません。しかし... XMLRPCを使用することができます...
ひとつの方法はこのライブラリを使うことです: WordPress XML-RPC PHP Client 。それはあなたのためにほとんどずっと仕事をするでしょうか、またはあなたはネイティブの WP_HTTP_IXR_Client classを使うことができます。
指定した資格情報が正しいかどうかを確認するには、wp.getUsersBlogs
メソッドを使用できます。