web-dev-qa-db-fra.com

Ajout d'un champ d'authentification supplémentaire dans la page de connexion

Je vais améliorer ma page d'authentification WordPress. Mon idée est d’ajouter simplement un champ supplémentaire dans la page de connexion. Le champ supplémentaire demande à l'utilisateur de saisir un code d'identification personnel (4 à 8 chiffres).

J'ai changé la présentation de la page de connexion dans wp-login.php et ajouté une colonne supplémentaire pour stocker le code d'identification personnel dans la base de données MySQL.

Cependant, je ne sais pas quelle partie du codage est utilisée pour vérifier le mot de passe car je veux faire référence au codage existant.

Comment puis-je le faire efficacement?

7
nomall

Tout d’abord, je voudrais - déconseiller d’éditer les fichiers de base car ils seront écrasés lors de la prochaine mise à jour de WordPress.

De plus, vous devriez mettez à jour WordPress, car il inclura souvent des mises à jour de sécurité. (C'est récemment été rapporté qu'il y a eu une série d'attaques sur des sites utilisant des versions obsolètes de WordPress)

Afin de réaliser ce que vous voulez réellement faire, je vous recommande d'utiliser hooks ) comme meilleur moyen de modifier WordPress.

En tant que tel, pour créer un champ supplémentaire sur votre page de connexion, vous pouvez utiliser le hook d'action login_form:

add_action('login_form','my_added_login_field');
function my_added_login_field(){
    //Output your HTML
?>
    <p>
        <label for="my_extra_field">My extra field<br>
        <input type="text" tabindex="20" size="20" value="" class="input" id="my_extra_field" name="my_extra_field_name"></label>
    </p>
<?php
}

Ensuite, nous devons vérifier que ce qu'ils ont entré dans le champ correspond à ce que vous avez stocké. Dans le code suivant, j'ai supposé que vous aviez stocké le code d'identification en tant que méta-valeur utilisateur avec la clé méta my_ident_code. Vous devriez le faire plutôt que de créer votre propre colonne! . Voir les pages Codex pour

Pour vérifier un utilisateur, vous pouvez utiliser le filtre authenticate. Cela transmet le nom d'utilisateur et le mot de passe entrés. Si le code d'identification est correct, renvoyez null pour permettre à WordPress de vérifier le mot de passe et le nom d'utilisateur. Si ce n'est pas le cas, supprimez l'authentification de WordPress et renvoyez une erreur. Cela oblige l'utilisateur à revenir à la page de connexion, où ils verront l'erreur affichée.

add_filter( 'authenticate', 'my_custom_authenticate', 10, 3 );
function my_custom_authenticate( $user, $username, $password ){
    //Get POSTED value
    $my_value = $_POST['my_extra_field_name'];

    //Get user object
    $user = get_user_by('login', $username );

    //Get stored value
        $stored_value = get_user_meta($user->ID, 'my_ident_code', true);

    if(!$user || empty($my_value) || $my_value !=$stored_value){
        //User note found, or no value entered or doesn't match stored value - don't proceed.
            remove_action('authenticate', 'wp_authenticate_username_password', 20);
            remove_action('authenticate', 'wp_authenticate_email_password', 20); 

        //Create an error to return to user
            return new WP_Error( 'denied', __("<strong>ERROR</strong>: You're unique identifier was invalid.") );
    }

    //Make sure you return null 
    return null;
}
13
Stephen Harris

Cette réponse à titre de référence seulement.

Vous ne devez pas éditer les fichiers WordPress principaux, sinon vous perdrez vos modifications après une mise à jour.

Voici comment WordPress gère son processus de vérification du mot de passe de connexion, comme indiqué à la ligne 250 du fichier /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;
}
2
Manimaran

Si éditer tout ce code semble un peu intimidant, il existe un bon plugin pour cela:

Cimy Extra Fields

Ou vous pourriez envisager d'utiliser Thème Mon identifiant qui peut le faire, mais cela nécessite un peu de codage. Il ajoute également un peu de fonctionnalité supplémentaire. Vous pouvez utiliser ces deux plugins ensemble.

0
itsdanprice