Agregar un campo de autenticación adicional en la página de inicio de sesión

17 mar 2012, 13:19:43
Vistas: 15.5K
Votos: 7

Quiero mejorar la página de autenticación de mi WordPress. Mi idea es agregar un campo adicional en la página de inicio de sesión. Este campo extra requerirá que el usuario ingrese un código de identificación personal (de 4 a 8 dígitos).

He modificado el diseño de la página de login en wp-login.php y añadí una columna adicional en la base de datos MySQL para almacenar el código de identificación personal.

Sin embargo, no sé qué parte del código se utiliza para verificar la contraseña, ya que quiero consultar el código existente como referencia.

¿Cómo puedo hacer esto de manera efectiva?

0
Todas las respuestas a la pregunta 3
1
17

En primer lugar, te aconsejaría que no edites los archivos principales ya que se sobrescribirán cuando actualices WordPress.

Además, deberías actualizar WordPress, porque a menudo incluye actualizaciones de seguridad. (Recientemente se ha informado de una oleada de ataques a sitios que usan versiones desactualizadas de WordPress)

Para lograr lo que realmente quieres hacer, te recomiendo usar hooks como la mejor manera de editar WordPress.

Por lo tanto, para crear un campo adicional en tu página de inicio de sesión, puedes usar el hook de acción login_form:

add_action('login_form','my_added_login_field');
function my_added_login_field(){
    //Mostrar tu HTML
?>
    <p>
        <label for="my_extra_field">Mi campo adicional<br>
        <input type="text" tabindex="20" size="20" value="" class="input" id="my_extra_field" name="my_extra_field_name"></label>
    </p>
<?php
}

Luego necesitamos verificar que lo que ingresaron en el campo coincida con lo que has almacenado. En el siguiente código, he asumido que has almacenado el código de identificación como un metadato de usuario con la clave my_ident_code. ¡Debes hacer esto en lugar de crear tu propia columna!. Consulta las páginas del Codex para:

Para verificar a los usuarios puedes usar el filtro authenticate. Este pasa el nombre de usuario y contraseña ingresados. Si el código de identificación es correcto, devuelve null para permitir que WordPress verifique la contraseña y nombre de usuario. Si no es correcto, elimina la autenticación de WordPress y devuelve un error. Esto obliga al usuario a volver a la página de inicio de sesión, donde verá el error mostrado.

add_filter( 'authenticate', 'my_custom_authenticate', 10, 3 );
function my_custom_authenticate( $user, $username, $password ){
    //Obtener valor POSTEADO
    $my_value = $_POST['my_extra_field_name'];

    //Obtener objeto de usuario
    $user = get_user_by('login', $username );

    //Obtener valor almacenado
        $stored_value = get_user_meta($user->ID, 'my_ident_code', true);

    if(!$user || empty($my_value) || $my_value !=$stored_value){
        //Usuario no encontrado, o no se ingresó valor o no coincide con el valor almacenado - no proceder.
            remove_action('authenticate', 'wp_authenticate_username_password', 20);
            remove_action('authenticate', 'wp_authenticate_email_password', 20); 

        //Crear un error para devolver al usuario
            return new WP_Error( 'denied', __("<strong>ERROR</strong>: Tu identificador único no era válido.") );
    }

    //Asegúrate de devolver null 
    return null;
}
17 mar 2012 13:41:23
Comentarios

Es una pena que esto no se haya marcado como correcto, ya que es una respuesta perfectamente explicada y codificada que funciona al 100%.

Nathan Nathan
4 dic 2020 17:08:56
0

Esta respuesta es solo para fines de referencia.

No deberías editar los archivos núcleo de WordPress o perderás tus modificaciones después de una actualización.

A continuación se muestra cómo WordPress maneja su proceso de verificación de contraseñas de inicio de sesión, como se ve en la línea 250 del archivo /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;
}
17 mar 2012 13:30:44
0

Si editar todo ese código parece un poco abrumador, hay un buen plugin para esto:

Cimy Extra Fields

O podrías considerar usar Theme My Login que puede hacer esto, pero requiere algo de codificación. También añade bastante funcionalidad extra. Puedes usar estos dos plugins juntos sin problemas.

17 mar 2012 14:31:04