Aggiungere un campo di autenticazione aggiuntivo nella pagina di login
Voglio migliorare la pagina di autenticazione del mio WordPress. La mia idea è aggiungere semplicemente un campo extra nella pagina di login. Questo campo aggiuntivo richiederà all'utente di inserire un codice di identificazione personale (da 4 a 8 cifre).
Ho modificato il layout della pagina di login in wp-login.php
e aggiunto una colonna extra nel database MySQL per memorizzare il codice di identificazione personale.
Tuttavia, non so quale parte del codice viene utilizzata per verificare la password, poiché vorrei fare riferimento al codice esistente.
Come posso farlo in modo efficace?

Innanzitutto, ti sconsiglio vivamente di modificare i file core poiché verranno sovrascritti al prossimo aggiornamento di WordPress.
Inoltre, dovresti aggiornare WordPress, perché spesso include aggiornamenti di sicurezza. (Recentemente è stato segnalato che c'è stata un'ondata di attacchi a siti che utilizzavano versioni obsolete di WordPress)
Per ottenere ciò che vuoi fare realmente, ti consiglio di utilizzare gli hook come metodo migliore per modificare WordPress.
Quindi, per creare un campo aggiuntivo nella tua pagina di login, puoi utilizzare l'hook login_form
:
add_action('login_form','my_added_login_field');
function my_added_login_field(){
//Output your HTML
?>
<p>
<label for="my_extra_field">Il mio campo aggiuntivo<br>
<input type="text" tabindex="20" size="20" value="" class="input" id="my_extra_field" name="my_extra_field_name"></label>
</p>
<?php
}
Ora dobbiamo verificare che ciò che hanno inserito nel campo corrisponda a ciò che hai memorizzato. Nel codice seguente, ho ipotizzato che tu abbia memorizzato il codice di identificazione come valore meta utente con la chiave meta my_ident_code
. Dovresti fare questo piuttosto che creare la tua colonna!. Consulta le pagine del Codex per:
- la funzione
add_user_meta
- la funzione
update_user_meta
- la funzione
get_user_meta
Per verificare un utente puoi utilizzare il filtro authenticate
. Questo passa il nome utente e la password inseriti. Se il codice di identificazione è corretto, restituisci null
per consentire a WordPress di verificare la password e il nome utente. Se non è corretto, rimuovi l'autenticazione di WordPress e restituisci un errore. Questo costringe l'utente a tornare alla pagina di accesso, dove vedrà l'errore visualizzato.
add_filter( 'authenticate', 'my_custom_authenticate', 10, 3 );
function my_custom_authenticate( $user, $username, $password ){
//Ottieni il valore POSTATO
$my_value = $_POST['my_extra_field_name'];
//Ottieni l'oggetto utente
$user = get_user_by('login', $username );
//Ottieni il valore memorizzato
$stored_value = get_user_meta($user->ID, 'my_ident_code', true);
if(!$user || empty($my_value) || $my_value !=$stored_value){
//Utente non trovato, o nessun valore inserito o non corrisponde al valore memorizzato - non procedere.
remove_action('authenticate', 'wp_authenticate_username_password', 20);
remove_action('authenticate', 'wp_authenticate_email_password', 20);
//Crea un errore da restituire all'utente
return new WP_Error( 'denied', __("<strong>ERRORE</strong>: Il tuo identificatore univoco non era valido.") );
}
//Assicurati di restituire null
return null;
}

Questa risposta è solo a scopo di riferimento.
Non dovresti modificare i file core di WordPress altrimenti perderai le tue modifiche dopo un aggiornamento.
Di seguito è mostrato come WordPress gestisce il processo di verifica della password di login, come si può vedere alla riga 250 del file /wp-includes/class-phpass.php
:
function CheckPassword($password, $stored_hash)
{
$hash = $this->crypt_private($password, $stored_hash);
if ($hash[0] == '*')
$hash = crypt($password, $stored_hash);
return $hash == $stored_hash;
}

Se modificare tutto quel codice ti sembra un po' complicato, c'è un buon plugin per questo:
Oppure potresti considerare l'uso di Theme My Login che può fare questo, ma richiede un po' di programmazione. Aggiunge anche molte funzionalità extra. Puoi tranquillamente usare questi due plugin insieme.
