Verificare email pentru utilizatorii noi

27 oct. 2011, 07:55:13
Vizualizări: 15.4K
Voturi: 5

Doresc să implementez un plugin care să necesite ca utilizatorii noi să răspundă la un email pentru a-și verifica adresa de email la înregistrare. Deja fac cercetări ample în codex, dar sunt foarte începător și aș aprecia câteva indicii, în special legate de menținerea utilizatorului inactiv până când își verifică adresa de email. Cred că voi reuși să gestionez restul pe cont propriu.

1
Comentarii

WordPress nu face asta în mod implicit?

Flimm Flimm
29 mai 2019 20:04:32
Toate răspunsurile la întrebare 1
6
13

Am avut o problemă foarte similară pe care am rezolvat-o zilele trecute. În cazul meu, am vrut să permit utilizatorilor să își aleagă propria parolă și apoi să își activeze contul prin e-mail. Există multe aspecte legate de acest proces, așa că voi prezenta doar cum am realizat verificarea prin e-mail.

În primul rând, am folosit user_register (rulează când un utilizator este înregistrat) și am creat o cheie (de exemplu, am hash-uit timpul, adresa de e-mail a utilizatorului și un șir aleatoriu etc.) și am stocat această cheie în tabelul usermeta. Aceasta va fi ștearsă când utilizatorul își activează contul.

Pentru a preveni conectarea unui utilizator neactivat, am adăugat verificări suplimentare la procesul de autentificare, folosind hook-ul authenticate. De exemplu:

Editare Conform comentariilor, filtrul authenticate ar trebui să returneze un obiect WP_Error în caz de eșec, în caz contrar, să returneze null. wp_authenticate_username_password rulează după această funcție, iar dacă primește un obiect WP_User, nu efectuează nicio verificare de autentificare și presupune că acestea au fost deja făcute.

Codul editat returnează ceea ce i-a fost transmis sau un obiect WP_Error dacă cheia de activare există (adică utilizatorul nu și-a activat încă contul).

add_filter( 'authenticate', 'wpse32218_check_for_key', 10, 3 );
function wpse32218_check_for_key( $user, $username, $password ){
    $user_obj = get_user_by('login', $username );

    if ($username!=''){
        $value = get_user_meta($user->ID, 'confirmed', true);
        if($value!=null){
            $user = new WP_Error( 'denied', __("<strong>EROARE</strong>: Trebuie să vă activați contul.".$value."") );//crează o eroare
            remove_action('authenticate', 'wp_authenticate_username_password', 20); //cheie găsită - nu continua!
        }
    }
    return $user;
}

(puteți folosi shake_error_codes pentru a face caseta de autentificare să se zgâlțâie dacă cheia este găsită, dacă doriți :D).

Apoi, în plugin-ul dumneavoastră, va trebui să suprascrieți wp_new_user_notification (care este o funcție pluggable prezentă în /wp_includes/pluggable.php). Această funcție trimite e-mailul către noul utilizator și către administrator.

Copiați funcția în plugin-ul dumneavoastră, în interiorul

if ( !function_exists('wp_new_user_notification') ) :
    //Define your wp_new_user_notification function here
endif;

și apoi adaptați-o, astfel încât să preia și să includă cheia de activare în mesajul către utilizator.

Pentru proiectul la care lucram, am creat un link din cheia de activare pe care utilizatorul îl putea face clic pentru a-și activa contul. De exemplu, dacă cheia lor era 01234ABCDE: http://www.example.com?confirm=01234ABCDE.

Folosind filtrul query_vars, am înregistrat variabila 'confirm' în WordPress. Apoi, cu filtrul template_include, ori de câte ori acea variabilă este setată (de exemplu, ca mai sus), redirecționez utilizatorul către confirm.php (un fișier de șablon aflat în directorul temei mele).

Acest șablon încearcă să preia utilizatorul cu cheia corespunzătoare. Dacă îl găsește, șterge cheia. Acum sunt activați și se pot conecta. Dacă nu, afișează un mesaj de eroare (cheia nu există sau contul a fost deja activat). Dacă există mai mulți utilizatori cu aceeași cheie de activare (nu ar trebui să existe!), apare și o eroare.

27 oct. 2011 16:18:54
Comentarii

Uau, mulțumesc! Sunt sigur că voi implementa asta diseară cu ajutorul vostru.

ProfK ProfK
27 oct. 2011 19:31:13

Doar o avertizare. O avertizare foarte serioasă! Am folosit acest cod într-un mic plugin pe care l-am dezvoltat pentru a afișa două câmpuri de parolă (al doilea pentru confirmare, ca să se potrivească), pe formularul de înregistrare, astfel încât utilizatorii să-și poată alege propria parolă. După activarea plugin-ului și testare, am descoperit că utilizatorii puteau introduce orice combinație de caractere pentru parolă, nu cea pe care o aleseseră inițial. Foarte periculos. După ce am investigat, exact acest bloc de cod era cauza. Acum funcționez fără acest cod.

User User
14 feb. 2012 21:33:23

Avertismentul lui Phil este corect, acest cod are o problemă gravă. Dar este ușor de reparat. Doar eliminați return $user și veți rezolva problema de securitate.

User User
10 aug. 2012 09:54:05

@Phil @Scott Mulțumesc pentru observație. Am corectat codul. Dacă funcția wp_authenticate_username_password primește un obiect de utilizator, aceasta va sări peste autentificare. Noua funcție returnează orice i se transmite și doar un obiect de eroare dacă contul nu este activat. Acest lucru permite plugin-urilor să implementeze propria funcție de autentificare care rulează înaintea acesteia.

Stephen Harris Stephen Harris
10 aug. 2012 12:54:34

@StephenHarris ai luat în considerare să împărtășești asta ca un plugin? Din câte știu eu, nu există nimic similar disponibil momentan. Personal, nu pot să întrerup celelalte activități de programare pentru a începe să lucrez în PHP. Un plugin ca acesta ar fi de mare ajutor. Mulțumesc!

Dan Rosenstark Dan Rosenstark
29 ian. 2013 00:56:03

Sau poate să ignorăm asta. Tocmai am verificat și site-ul meu WP permite doar parole trimise efectiv utilizatorilor prin email, deci totul este în regulă pentru moment.

Dan Rosenstark Dan Rosenstark
29 ian. 2013 01:00:56
Arată celelalte 1 comentarii