web-dev-qa-db-fra.com

J'essaie de créer un champ de question de sécurité pour ma page de connexion

Au cours des 2 dernières heures, j'ai essayé de créer un plugin mu qui oblige l'utilisateur à répondre à une question en premier afin de pouvoir se connecter au site Web.

C'est "Quel est le nom du cheval blanc de Napoléon?", Ainsi l'utilisateur répond "blanc" et cela devrait fonctionner, par théorie. Le problème est qu'il semble ne pas être validé lors de la connexion. Ceci est mon code:

 <?php

add_action( 'login_form', 'add_login_field' );
function add_login_field() { ?>
    <p>
        <label><?php _e('What is the name of the white horse of Napoleon?') ?><br />
        <input type="text" name="user_proof" id="user_proof" class="input" size="25" tabindex="20" /></label>
    </p>
<?php }

add_action( 'login_post', 'add_login_field_validate', 10, 3 );

function add_login_field_validate( $sanitized_user_login, $user_email, $errors) {
    if (!isset($_POST[ 'user_proof' ]) || empty($_POST[ 'user_proof' ])) {
        return $errors->add( 'proofempty', '<strong>ERROR</strong>: You did not answer the proof-of-humanship question.'  );
    } elseif ( strtolower( $_POST[ 'user_proof' ] ) != 'white' ) {
        return $errors->add( 'prooffail', '<strong>ERROR</strong>: You did not answer the proof-of-humanship question correctly.'  );
    }
}

?>

Je crois que le problème est avec la partie:

add_action( 'login_post', 'add_login_field_validate', 10, 3 );

Quelqu'un peut-il me donner un coup de main ici?

1
023023

Je ne connais aucune action login_post - utilisez plutôt le filtre authenticate, dans wp_authenticate(), appelé par wp_signon():

function wpse_185339_check_user_answer( $user ) {
    if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) {
        if ( empty( $_POST[ 'user_proof' ] ) ) {
            $user = new WP_Error( 'proofempty', '<strong>ERROR</strong>: You did not answer the proof-of-humanship question.' );
        } elseif ( strtolower( $_POST[ 'user_proof' ] ) !== 'white' ) {
            $user = new WP_Error( 'prooffail', '<strong>ERROR</strong>: You did not answer the proof-of-humanship question correctly.' );
        }
    }

    return $user;
}

add_filter( 'authenticate', 'wpse_185339_check_user_answer', 100 );
1
TheDeadMedic