it-swarm.com.de

So überprüfen Sie Benutzername/Passwort, ohne den Benutzer anzumelden

Ich schreibe ein Plugin, das einen API-Endpunkt erstellt, der die Benutzer-/Kennwortpaare überprüft.

Ich verwende derzeit wp_signon() , um zu überprüfen, ob die Kombination aus Benutzername und Kennwort funktioniert. Dies funktioniert einwandfrei, wenn die Anmeldeinformationen fehlschlagen, da ein Fehlerobjekt zurückgegeben wird. Wenn die Anmeldeinformationen jedoch korrekt sind, wird dieser Benutzer automatisch angemeldet, sodass mein Endpunkt eine ganze Seite zurückgibt.

Der Codex erwähnt derzeit nicht einmal die Tatsache, dass er den Benutzer automatisch anmeldet. Es scheint auch keinen Parameter zu akzeptieren, um diese Funktionalität zu unterdrücken. Für meine Zwecke wäre ich einfach boolean in Ordnung.

UPDATE: Ich musste eine einzige Antwort auswählen, aber es gab viele nützliche Informationen zu einigen der anderen Antworten, die ich hier kurz zusammenfassen werde ...

  1. Es gibt IS eine Funktion, die genau das tut, was ich versucht habe: wp_authenticate($username, $password) JEDOCH, sie hat einen Nachteil. Es werden automatisch die Login-Cookies gesetzt, die in einer Situation wie meiner Probleme verursachen können. Also sei vorsichtig. Diese Funktion ist derzeit nicht im Codex enthalten.

  2. Die beste Wahl für das, was ich tue, ist wp_authenticate_username_password($user, $username, $password), da die Login-Cookies NICHT gesetzt werden. Diese Funktion ist ausführlicher dokumentiert, aber das WIRKLICH wichtige Detail, das nicht im Codex enthalten war, ist, dass Sie NULL als ersten Parameter übergeben können. Dies bedeutet, dass Sie es effektiv verwenden können, um genau wie wp_authenticate() vorzugehen, ohne sich Sorgen darüber zu machen, dass die Cookies kaputt gehen. Lesen Sie die Dokumentation, damit Sie von der Antwort nicht verwirrt werden. Es gibt entweder ein WP_User-Objekt oder einen WP_Error zurück (kein Boolescher Wert!).

4
emersonthis

Es gibt eine Funktion im user.php der Kerndateien mit dem Namen wp_authenticate_username_password , die genau das zu sein scheint, wonach Sie suchen.

Wenn Sie vermeiden möchten, das Objekt $user zu werfen (Sie haben wahrscheinlich nur den Benutzernamen + das Passwort), dann werfen Sie einfach null als erstes Funktionsargument in:

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

Sie können das Ergebnis dann einfach mit is_wp_error( $check ) überprüfen.

6
fdsa

Benutzen,

und

Erläuterung

// 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...

Anmerkungen

  • $username sollte standardmäßig true sein, da sonst ein Benutzerobjekt nicht zurückgegeben würde, wenn der angegebene $username nicht mit einem bereits in der Datenbank vorhandenen übereinstimmt. Daher hängt die Validierung dann von der Variablen $password ab, in der die vom Benutzer bereitgestellte Formulareingabe gespeichert wird.

  • Möglicherweise können Sie dies effizienter erreichen, indem Sie den vorhandenen Code verkürzen oder andere API-Funktionen verwenden.

AKTUALISIEREN

Basierend auf dem Vorschlag von fdsa könnten Sie wiederum wp_authenticate_username_password auf diese Weise verwenden,

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

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

echo 'not authenticated';

} else {

echo 'authenticated';

}

Aber noch besser als das,

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

if (is_wp_error($auth)) {

echo 'not authenticated';

} else {

echo 'authenticated';

}

Tatsächlich sollte die Antwort fdsa für die effizienteste Methode über eine (leider) undokumentierte WP Kernfunktion gegeben werden.

http://wpseek.com/wp_authenticate_username_password/

1
userabuser

Haftungsausschluss: Diese Antwort soll nur zeigen, was sich hinter den Kulissen abspielt, und soll kein Beispiel für die Vorgehensweise im wirklichen Leben sein.


Zurückverfolgen

wp_signon() ruft wp_set_auth_cookie() auf, der dann wp_generate_auth_cookie() aufruft. Das Ergebnis wird in setcookie() als 2 verwendetnd Streit.

(Non-Performant) Spaß mit Filtern

a.k.a. WordPress in die falsche Richtung täuschen.

Sie können dann einfach in den 'auth_cookie'- Filter in wp_generate_auth_cookie() springen und ihn einfach auf null setzen oder auf etwas anderes als den SECURE_AUTH_COOKIE- oder AUTH_COOKIE-Wert. Dadurch erhalten Sie einen sinnlosen Cookie, der sich nicht anmelden kann.

1
kaiser

"Ta-da": wp_authenticate($username, $password)

Es ist überhaupt nicht im Codex, aber Sie können es auf wpseek nachschlagen .

Es macht genau das, wonach es klingt. Nimmt einen Benutzernamen und ein Klartext-Passwort und gibt entweder ein WP_User-Objekt oder einen WP_Error zurück, und es meldet sich NICHT an.

Ein Hinweis zur Vorsicht! Folgendes wird IMMER true zurückgeben (da die Funktion ein Objekt in beide Richtungen zurückgibt):

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

Sie werden wahrscheinlich so etwas tun wollen:

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

Ich hoffe das hilft jemandem.

0
emersonthis