Volver a Proyectos Listado de Artículos

Automatizar doble factor de autenticación en WordPress

Luis Ruiz

Escrito por Luis Ruiz Actualizado el

Cómo mejorar la seguridad de WordPress con el plugin de doble factor de autenticación Two-Factor. Veremos algo de código para mejorar su uso.

En los tiempos que corren está claro que necesitas tener un doble factor de autenticación en WordPress para evitar sustos. Creo que uno de los mejores plugin para la doble autenticación (2FA) es «Two-Factor», es Open-source y puedes ver fácilmente su código en GitHub. Después de esta introducción vamos al meollo del asunto.

Asignar la doble autenticación por email a todos los usuarios que no la tengan.

Una de las necesidades que le veo al plugin es poder asignar a todos los usuarios el doble factor autenticación (2FA), que actualmente tienes que ir uno a uno. Si tienes un volumen alto de registros, o se generan de forma más automática como en intranet, membresías, etc., puede resultar algo tedioso.

Sacar usuario sin doble autenticación

Este script lo he utilizado para una intranet que tenía bastantes usuarios registrados y, al implementar el plugin, necesitaba mucho trabajo para ir usuario a usuario asignando el doble factor autenticación.

Si sabemos que todos los usuarios van a tener el 2FA haríamos lo siguiente para sacar cuáles de los usuarios no tienen lo tienen asignado.

// Tipo de autenticación
$two_factor_value = 'Two_Factor_Email';

// Mostramos todos los usuarios que no lo tengan asignado.
$users = get_users(
    array(
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key' => '_two_factor_enabled_providers',
                'compare' => 'NOT EXISTS'
            ),
            array(
                'key' => '_two_factor_enabled_providers',
                'value' => $two_factor_value,
                'compare' => 'NOT LIKE'
            )
        )
    )
);

Para este script hemos utilizado la función «get_users» para sacar los usuarios y la clase «WP_Meta_Query» para filtrar a aquellos usuarios que no tiene la key «_two_factor_enabled_providers», o no tiene asignada la que hemos definido en «$two_factor_value»

Asignar el tipo de autenticación a cada usuario

Una vez tenemos los usuarios que no tienen la autenticación, recorremos el listado y se lo asignamos.

foreach ($users as $user) {
	// Guardamos la autenticación que tiene el usuario, si es que la tiene.
    $two_factor_array = get_user_meta( $user->ID, '_two_factor_enabled_providers', false );
    
	// Añadimos la nueva.
	array_push($two_factor_array, $two_factor_value);
		
	// Se la asignamos o actualizamos al usuario
    update_user_meta($user->ID, '_two_factor_enabled_providers', $two_factor_array);
}

El script nos puede dar mucho juego, ya que podemos crear un Cronjobs o un webhook para ejecutar el script cada cierto tiempo. Además, puedes indicar que te envíe un email con lo que ha sucedido y así dedicarle menos tiempo a esta tarea, además de minimizar los posibles problemas de seguridad de tu WordPress.

Aquí tienes más información sobre notificaciones por email y plantillas de email para WordPress.

Asignar autenticación al crear cuenta

Otra forma de no tener que hacerlo manualmente es asignar el doble factor autenticación por email a la hora de crear un usuario. Lo podemos hacer utilizando la acción «user_register» o en alguna función, como es en nuestro caso a la hora de crear un usuario con un formulario externo.

$options=array(
    'user_login'  => $userLogin,
    ....
);
// Creamos usuario y guardamos su ID en la variable $user_id
$user_id = wp_insert_user($options);

// Asignar doble autenticación por email;
$two_factor_array = array('Two_Factor_Email');
update_user_meta( $user_id, '_two_factor_enabled_providers', $two_factor_array);

Con añadir las dos últimas líneas en nuestro código nos olvidamos de tener que estar atentos a qué usuarios se dan de alta y asignarle la doble autenticación. Sin duda nos ahorrará bastante tiempo si el volumen de registros es alto.

Cómo modificar el mensaje que se envía por email del plugin Two Factor.

Cuando un usuario hace login se le redirige a una pantalla para que inserte el código que le llega por email. Dicho mensaje en demasiado básico y quizás necesitemos modificarlo para dar presencia nuestra marca, añadir más información, etc.

Para esto utilizaremos el filtro «two_factor_token_email_message». Gracias a que los desarrolladores implementaron este filtro tenemos la posibilidad de cambiarlo sin tocar el código del plugin.

Lo descubrí mirando en su repositorio y buscando desde donde enviaban el email.

Función que genera el token y contiene el mensaje que se envía por email del plugin Two Factor
Función que genera el token y contiene el mensaje que se envía por email.

En la línea 229 tienen el mensaje, y en la línea 246 crean el filtro con «apply_filters». Utilizaremos la función «add_filter()» para modificar el mensaje con el siguiente código.

// Cambia el mensaje que se envía por email al solicitar el código del plugin TWO FACTOR
add_filter( 'two_factor_token_email_message', 'custom_two_factor_token_email_message', 10, 2 );

function custom_two_factor_token_email_message( $message, $token ) {
	$message = wp_strip_all_tags( sprintf( __( 'Introduce el código %s para poder acceder a la intranet Pepito.', 'two-factor' ), $token ) );
	return $message;
}

Aunque el filtro puede recibir tres variables, solo traemos «message» y «token», que son las únicas que utilizaremos para crear el mensaje nuevo.

Conclusión

Con el plugin «Two-Factor» podemos implementar fácilmente la autenticación doble factor en WordPress y así hacerlo más seguro y, con un poquito de código, adaptarlo a nuestras necesidades.