Verifică parola unui utilizator
Vreau să verific dacă utilizatorul are o anumită parolă, așa că am încercat cu wp_check_password
, dar contul pentru care se face verificarea este deconectat și nu se mai poate autentifica până când nu există un apel al wp_check_password
în cod.
Analizând codul, am descoperit că setează parola folosind noul hash, și mai mult, dacă folosesc wp_check_password( 'hello', md5('hello'), 1 );
, nici măcar nu verifică ce este în baza de date și returnează true. Nu este asta un bug?
Aveți idei cum pot verifica parola utilizatorului?

Exemplul tău funcționează corect. Verifici dacă parola hello
se potrivește cu versiunea hashuită a lui hello
- ceea ce firește că se întâmplă.
Nu m-am gândit suficient. Exemplul tău cauzează următoarea problemă:
- Verifici dacă
hello
se potrivește cu md5-ul luihello
(în loc de hash-ul din profilul utilizatorului). - Se potrivește și atunci WP consideră că aceasta este corectă, dar o versiune veche de md5 - care trebuie actualizată.
- Re-hashuiește
hello
și actualizează utilizatorul cu el, blocându-i accesul (deoarece parola lui devine acumhello
în loc de orice era înainte).
Vezi funcția wp_authenticate_username_password()
pentru un exemplu amplu, dar ideea de bază este:
$userdata = get_user_by('login', $username);
$result = wp_check_password($password, $userdata->user_pass, $userdata->ID);

Dar nu se potrivește în toate circumstanțele, ceea ce am presupus că era problema. În primul rând, funcția de hash pentru parolă este modulară, deci nu folosește neapărat md5 (de fapt, nu cred că o face în mod implicit - implicit este phpass).

@goldenapples nu are sens să suprascrii wp_hash_password()
și să lași wp_check_password()
. Neconcordanța hash-ului pur și simplu nu va permite nimănui să treacă verificarea, nu-i așa? :)

Oh, ai dreptate. wp_check_password()
va funcționa așa cum ai folosit-o în răspunsul tău. Mă refeream la întrebarea sa originală, verificând 'hello' împotriva md5 din 'hello', care va eșua decât dacă md5 este algoritmul folosit efectiv în wp_hash_password
...

@goldenapples funcția nativă wp_hash_password()
suportă md5 pentru compatibilitate inversă, ea re-hashuiește astfel de parole la verificare. Acum că mă gândesc, aceasta este probabil problema din întrebarea originală...

Da, dacă cele două parole furnizate se potrivesc folosind md5, wp_check_password va reseta parola utilizatorului folosind funcția actuală de hash. Deci în întrebarea originală, deoarece cele două parole furnizate se potriveau, schimba parola utilizatorului în "hello"...

@Rarst Mulțumesc! Aceasta funcționează. Și mă întrebam de ce trebuie să furnizez eu hash-ul. Este acolo pentru a menține compatibilitatea inversă, nu? Altfel doar parola de verificat și ID-ul ar fi fost suficiente.

@Ashfame funcțiile legate de parole sunt intenționat modularizate și foarte flexibile, astfel încât oamenii să poată construi sau integra scheme alternative de autentificare fără prea multe probleme.

@Rarst Vrei să spui că este pentru a face sistemul modular și nu pentru a menține compatibilitatea retroactivă cu diferite tipuri de hash-uri?

@Ashfame este compatibil retroactiv doar cu md5, deoarece acesta este ceea ce WordPress a folosit în trecut.

Puteți obține parola hash-uită din baza de date și să o comparați cu intrarea pe care doriți să o verificați folosind wp_hash_password().
Pentru a verifica dacă parola utilizatorului curent se potrivește cu "hello", încercați acest lucru:
if ( $current_user->user_pass == wp_hash_password( 'hello' ) )

if ( wp_hash_password( $xx_new_password ) != $xx_userinfo->user_pass )
funcționează diferit față de if ( !wp_check_password( $xx_new_password, $xx_userinfo->user_pass , $xx_id ) )
Ciudat! Mulțumesc pentru ajutor!

require_once ABSPATH . WPINC . '/class-phpass.php';
$wp_hasher = new PasswordHash(8, TRUE);
$password_hashed = '$P$BB3pP6fQAYa61ael0LNQlpB1NOyqNY0';
$plain_password = 'admin2';
if($wp_hasher->CheckPassword($plain_password, $password_hashed)) {
print 'Parola se potrivește.';
}
