web-dev-qa-db-ja.com

ユーザーにサインインせずにユーザー名/パスワードを確認する方法

私はユーザー名とパスワードのペアを検証するAPIエンドポイントを作成するプラグインを書いています。

私は現在 wp_signon() を使ってusername/passwordコンボが機能するかどうかをチェックしています。資格情報がエラーオブジェクトを返すために失敗した場合、これは正常に機能します。しかし、資格情報が適切であれば、そのユーザーに自動的にサインインするので、私のエンドポイントはページ全体を返します。

コーデックス 現在のところ、それが自動的にユーザーにログインするという事実さえ言及していません。その機能を抑制するためのパラメータを受け取ることもできません。私の目的のために私は単純なブール値で結構です。

更新: 私は一つの答えを選ばなければなりませんでした、しかしここで簡単に要約しようとする他の答えのいくつかの役に立つ情報がありました...

  1. IS私がやろうとしていたことを正確に実行する関数があります。wp_authenticate($username, $password)しかし、1つ欠点があります。それは自動的に私のような状況で問題を引き起こす可能性があるログインクッキーを設定します。ので注意してください。この関数は現在コーデックスにはありません。

  2. 私がやっていることのための最良の選択はログインクッキーを設定しないのでwp_authenticate_username_password($user, $username, $password)です。この関数はもっと文書化されていますが、コーデックスにはなかった本当に重要な詳細は最初のパラメータとしてNULLを渡すことができるということです。これはクッキーがめちゃくちゃになるのを心配せずにwp_authenticate()と全く同じようにそれを効果的に使うことができることを意味します。あなたが応答に混乱しないようにドキュメントを読んでください。 WP_UserオブジェクトまたはWP_Error(ブール値ではない!)のいずれかを返します。

4
emersonthis

user.php には wp_authenticate_username_password というコアファイルの関数があります。

$userオブジェクトを投入したくない場合は(おそらくユーザー名とパスワードしか持っていないでしょう)、次のように最初の関数引数としてnullを投入します。

$check = wp_authenticate_username_password( NULL, 'some_username', '#thepassw0rd' );

その後、is_wp_error( $check )を使って結果を確認するだけです。

6
fdsa

つかいます、

そして

説明

// get user by login via the supplied username (form input)
$user = get_user_by('login', $username);

//assign user ID based on user login name
$user_id = $user->ID;

// get user data by passing the assigned $user_id variable to get_userdata
// which returns the user object and a Host of user related info to access
$user_data = get_userdata($user_id);


// assign the username and password to variables
$user_login = $user_data->user_login;
$user_pass = $user_data->user_pass;

// check the username/password against the submitted input values
if ($user_login = $username && $user_pass = $password) {

// do something...

ノート

  • $usernameはデフォルトでtrueを検証します。そうでなければ、提供された$usernameがデータベースに既に存在するものと一致しない場合、ユーザーオブジェクトは返されません。そのため、検証は、ユーザーから提供されたフォーム入力を格納する$password変数に依存します。

  • 既存のコードを短くするか、他のAPI関数を使用することによって、これを達成するためのより効率的な方法があるかもしれません。

更新

fdsa による提案に基づいて、この方法でwp_authenticate_username_passwordを使用できます。

$auth = wp_authenticate_username_password($user, $username, $password);

if (!$auth->user_login = $username && !$auth->user_pass = $password) {

echo 'not authenticated';

} else {

echo 'authenticated';

}

しかしそれ以上に

$auth = wp_authenticate_username_password($user, $username, $password);

if (is_wp_error($auth)) {

echo 'not authenticated';

} else {

echo 'authenticated';

}

実際には(残念ながら)文書化されていないWPコア関数によって最も効率的な方法のためにクレジット/マーク付きの答えは fdsa に与えられるべきです。

http://wpseek.com/wp_authenticate_username_password/ /

1
userabuser

免責事項:この答えは、舞台裏で何が起こっているのかを示すためのものであり、物事の進め方に関する実際の例ではありません。


バックトレース

wp_signon() calls wp_set_auth_cookie()wp_generate_auth_cookie() を呼び出します。結果はsetcookie()の中で2として使われます。nd 引数。

フィルタを使った(パフォーマンスが悪い)楽しい

別名WordPressをだましている。

その後、wp_generate_auth_cookie()内の'auth_cookie'-フィルタに飛び込んで、単にnullまたはSECURE_AUTH_COOKIEまたはAUTH_COOKIEの値以外の値に設定するだけです。これにより、ログインできない無意味なCookieがあなたに残ります。

1
kaiser

"ただ":wp_authenticate($username, $password)

コーデックスにはまったく含まれていませんが、wpseekで調べることができます

それは正確には聞こえます。ユーザー名とプレーンテキストのパスワードを受け取り、WP_UserオブジェクトまたはWP_Error...のいずれかを返します。ログインすると、ログインしません。

注意の1つの注意!次は常にtrueを返します(関数がどちらの方法でもオブジェクトを返すため)。

$auth = ( wp_authenticate($username, $password) ) ? TRUE : FALSE;

あなたはおそらくこのようなことをしたいでしょう:

$test_creds = wp_authenticate($username, $pass) ;
$class = get_class($test_creds);
$auth = ( $class == 'WP_User' ) ? TRUE : FALSE ;

これが誰かに役立つことを願っています。

0
emersonthis