Pot conecta programatic un utilizator fără parolă?
Creez manual utilizatori în mod programatic și vreau să autentific utilizatorul nou creat. WordPress face ușoară accesarea parolei criptate, dar nu și versiunea în text simplu. Există vreo modalitate de a folosi wp_signon() fără parola în text simplu?
Am găsit o persoană care susține că a făcut acest lucru aici, dar nu a funcționat pentru mine.
MULȚUMESC!

Următorul cod realizează autentificarea automată, fără a fi necesară nicio parolă!
// Autentificare automată //
$username = "Admin";
$user = get_user_by('login', $username );
// URL de redirecționare //
if ( !is_wp_error( $user ) )
{
wp_clear_auth_cookie();
wp_set_current_user ( $user->ID );
wp_set_auth_cookie ( $user->ID );
$redirect_to = user_admin_url();
wp_safe_redirect( $redirect_to );
exit();
}

Funcționează excelent. Este suficient doar numele de utilizator, care nu este sensibil la majuscule.

get_user_by()
returnează false în caz de eșec, așa că ar trebui să verifici pentru false în loc de obiectul WP_Error

@Sjoerd Linders, unde pot conecta scriptul tău pentru a forța un utilizator să se conecteze?

wp_set_auth_cookie()
va autentifica un utilizator fără a fi nevoie să cunoști parola acestuia.

A funcționat perfect. Totuși, când îl folosesc, condiția is_user_logged_in()
nu pare să funcționeze. Știi dacă verifică altceva decât cookie-urile?

@Emerson - pe ce hook îi autentifici? trebuie să fie înainte ca antetele să fie trimise. încearcă și să folosești wp_set_current_user
înainte de a-i autentifica.

De fapt, nu am apelat-o dintr-un hook deloc. Doar am adăugat wp_set_auth_cookie()
în funcția mea de autentificare. Cred că trebuie să reconsider asta. Voi căuta și despre wp_set_current_user și voi reveni cu rezultatele. Mulțumesc foarte mult pentru ajutor!

Am găsit o altă soluție aici care folosește o abordare mai bună (cel puțin în opinia mea...). Nu este nevoie să setați niciun cookie, folosește API-ul WordPress:
/**
* Autentifică programatic un utilizator
*
* @param string $username
* @return bool True dacă autentificarea a reușit; false dacă nu
*/
function programmatic_login( $username ) {
if ( is_user_logged_in() ) {
wp_logout();
}
add_filter( 'authenticate', 'allow_programmatic_login', 10, 3 ); // se atașează mai devreme decât alte callback-uri pentru a le scurcircuita
$user = wp_signon( array( 'user_login' => $username ) );
remove_filter( 'authenticate', 'allow_programmatic_login', 10, 3 );
if ( is_a( $user, 'WP_User' ) ) {
wp_set_current_user( $user->ID, $user->user_login );
if ( is_user_logged_in() ) {
return true;
}
}
return false;
}
/**
* Un callback pentru filtrul 'authenticate' care autentifică utilizatorul folosind doar numele de utilizator.
*
* Pentru a evita potențiale vulnerabilități de securitate, această funcție ar trebui folosită doar în contextul unei autentificări programatice,
* și detașată imediat după ce este executată.
*
* @param WP_User $user
* @param string $username
* @param string $password
* @return bool|WP_User Un obiect WP_User dacă numele de utilizator corespunde unui utilizator existent, sau false dacă nu
*/
function allow_programmatic_login( $user, $username, $password ) {
return get_user_by( 'login', $username );
}
Cred că codul se explică de la sine:
Filtrul caută obiectul WP_User pentru numele de utilizator dat și îl returnează. Un apel la funcția wp_set_current_user
cu obiectul WP_User returnat de wp_signon
, o verificare cu funcția is_user_logged_in
pentru a vă asigura că sunteți autentificat, și asta e tot!
O bucată de cod frumoasă și curată, în opinia mea!

@Shebo Comentariul tău nu pare corect. Prima linie a funcției verifică dacă array-ul $credentials
este gol sau nu. Dacă array-ul nu este gol (cazul din răspunsul meu), valorile din array sunt folosite pentru autentificarea utilizatorului.

@Mike wow, cum am putut să ratez asta... Greșeala mea, îmi cer scuze pentru informația greșită. Voi șterge primul meu comentariu, pentru a evita confuzia. Totuși, soluție grozavă :)

Acest articol util oferă explicații despre motivul pentru care acest lucru este necesar: https://tommcfarlin.com/wordpress-user-caches/

Pe lângă Mike, Paul și Sjoerd:
Pentru a gestiona mai bine redirecționările din login.php
:
//---------------------Autentificare automată--------------------
if(!is_user_logged_in()){
$username = "user1";
if($user=get_user_by('login',$username)){
clean_user_cache($user->ID);
wp_clear_auth_cookie();
wp_set_current_user( $user->ID );
wp_set_auth_cookie( $user->ID , true, false);
update_user_caches($user);
if(is_user_logged_in()){
$redirect_to = user_admin_url();
wp_safe_redirect( $redirect_to );
exit;
}
}
}
elseif('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] == wp_login_url()){
$redirect_to = user_admin_url();
wp_safe_redirect( $redirect_to );
exit;
}
De plasat în wp-config.php
imediat după
require_once(ABSPATH . 'wp-settings.php');
Pentru informație
Bazat pe soluția de mai sus, am lansat un plugin pentru a menține utilizatorul autentificat de la un WordPress la altul prin sincronizarea datelor utilizatorului și a sesiunii cookie:

Destul de ciudat, dar singura modalitate care funcționează pentru mine este dacă fac o redirecționare și apoi die():
clean_user_cache($user->ID);
wp_clear_auth_cookie();
wp_set_current_user( $user_id, $user->user_login );
wp_set_auth_cookie( $user_id, true, true );
update_user_caches( $user );
if ( is_user_logged_in() ) {
$redirect_to = $_SERVER['REQUEST_URI'];
header("location:".$redirect_to );
die();
}

Cred că acesta este drumul corect. Ar trebui să curățăm cache-ul și cookie-urile utilizatorului. După autentificare, trebuie să declanșăm hook-ul wp_login
pentru a permite altor pluginuri și funcții de bază să lucreze împreună.
$user = get_user_by( 'ID', $user_id ); // Obține WP_User din ID-ul utilizatorului.
// $user = get_user_by( 'email', $email ); // Sau obține din email.
// $user = get_user_by( 'login', $username ); // Sau obține din numele de utilizator.
if ( false !== $user ) {
clean_user_cache( $user->ID );
wp_clear_auth_cookie();
wp_set_current_user( $user->ID, $user->user_login );
wp_set_auth_cookie( $user->ID );
update_user_caches( $user );
do_action( 'wp_login', $user->user_login, $user );
}
