Verifica email per nuovi utenti

27 ott 2011, 07:55:13
Visualizzazioni: 15.4K
Voti: 5

Vorrei implementare un plugin che richieda ai nuovi utenti di rispondere a un'email per verificare il loro indirizzo email durante la registrazione. Sto già facendo ricerche approfondite sul codex, ma sono molto nuovo e apprezzerei alcuni suggerimenti, specialmente riguardo al mantenere l'utente inattivo fino alla verifica dell'email. Il resto penso che riuscirò a gestirlo da solo.

1
Commenti

WordPress non lo fa già di default?

Flimm Flimm
29 mag 2019 20:04:32
Tutte le risposte alla domanda 1
6
13

Ho avuto un problema molto simile che ho risolto l'altro giorno. Nel mio caso volevo permettere agli utenti di scegliere la propria password e poi attivare il proprio account via email. C'è molto da dire su questo, quindi mi limiterò a delineare come ho ottenuto la verifica via e-mail.

Innanzitutto, ho usato user_register (si attiva quando un utente viene registrato) e ho creato una chiave (ad esempio, ho fatto l'hash del tempo, dell'indirizzo email dell'utente e di una stringa casuale, ecc.) e ho memorizzato questa chiave nella tabella usermeta. Questa verrà eliminata quando l'utente attiva il proprio account.

Per impedire a un utente non attivato di accedere, ho aggiunto controlli aggiuntivi al login, usando l'hook authenticate. Per esempio:

Modifica Come indicato nei commenti, il filtro authenticate dovrebbe restituire un oggetto WP_Error in caso di fallimento, altrimenti restituisce null. wp_authenticate_username_password viene eseguito dopo questa funzione, e se viene passato un oggetto WP_User non esegue alcun controllo di autenticazione e assume che siano già stati fatti.

Il codice modificato restituisce ciò che gli è stato passato, oppure un oggetto WP_Error se la chiave di attivazione esiste (cioè l'utente deve ancora attivare il proprio account).

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>ERRORE</strong>: Devi attivare il tuo account.".$value."") );//crea un errore
            remove_action('authenticate', 'wp_authenticate_username_password', 20); //chiave trovata - non procedere!
        }
    }
    return $user;
}

(puoi usare shake_error_codes per far tremare la casella di login se la chiave viene trovata, se ti piace :D).

Poi, nel tuo plugin, dovrai sovrascrivere wp_new_user_notification (che è una funzione pluggable presente in /wp_includes/pluggable.php). Questa funzione invia l'email al nuovo utente e all'amministratore.

Copia la funzione nel tuo plugin, all'interno di

if ( !function_exists('wp_new_user_notification') ) :
    //Definisci qui la tua funzione wp_new_user_notification
endif;

e poi adattala in modo che recuperi e includa la chiave di attivazione nel messaggio all'utente.

Per il progetto su cui stavo lavorando, ho creato un link dalla chiave di attivazione che l'utente poteva cliccare per attivare il proprio account. Ad esempio, se la loro chiave era 01234ABCDE: http://www.example.com?confirm=01234ABCDE.

Usando il filtro query_vars ho registrato la variabile 'confirm' con WordPress. Poi con il filtro template_include, ogni volta che quella variabile è impostata (come sopra) reindirizzo l'utente a confirm.php (un file template presente nella directory del mio tema).

Questo template cerca di recuperare l'utente con la chiave corrispondente. Se lo trova, elimina la chiave. Ora sono attivati e possono accedere. Se non lo trova, mostra un messaggio di errore (chiave inesistente o account già attivato). Se ci sono più utenti con la stessa chiave di attivazione (non dovrebbero esserci!) mostra anche un errore.

27 ott 2011 16:18:54
Commenti

Wow, grazie! Sono sicuro che riuscirò a implementarlo stasera stessa con tutto il tuo aiuto.

ProfK ProfK
27 ott 2011 19:31:13

Giusto un avvertimento. Un avvertimento molto serio! Ho usato questo codice in un piccolo plugin che ho sviluppato per visualizzare due campi password (il secondo per la conferma che corrispondessero), nel modulo di registrazione in modo che gli utenti potessero scegliere la propria. Dopo aver attivato il plugin e testato, ho scoperto che gli utenti potevano inserire qualsiasi combinazione di testo come password. Non quella che avevano scelto originariamente. Molto pericoloso. Dopo aver indagato un po', era esattamente questo blocco di codice a causare il problema. Ora sto facendo a meno di questo codice.

User User
14 feb 2012 21:33:23

L'avvertimento di Phil è corretto, questo codice è gravemente difettoso. Ma è facile da correggere. Basta rimuovere il return $user e avrai risolto la falla di sicurezza.

User User
10 ago 2012 09:54:05

@Phil @Scott Grazie per averlo segnalato. Ho corretto il codice. Se a wp_authenticate_username_password viene passato un oggetto utente, salta l'autenticazione. La nuova funzione restituisce qualsiasi cosa le venga passata, e solo un oggetto di errore se l'account non è attivato. Ciò consente ai plug-in di implementare la propria funzione di autenticazione che viene eseguita prima di questa.

Stephen Harris Stephen Harris
10 ago 2012 12:54:34

@StephenHarris hai considerato di condividerlo come plugin? Per quanto ne so, non c'è niente di simile disponibile al momento. Personalmente, non posso interrompere il mio altro codice per iniziare a lavorare in PHP. Un plugin come questo sarebbe di grande aiuto. Grazie!

Dan Rosenstark Dan Rosenstark
29 gen 2013 00:56:03

O forse lascia perdere. Ho appena verificato e il mio sito WP consente solo password effettivamente inviate agli utenti via email, quindi per ora va tutto bene.

Dan Rosenstark Dan Rosenstark
29 gen 2013 01:00:56
Mostra i restanti 1 commenti