Comprobar la contraseña de un usuario
Quiero verificar si un usuario tiene una contraseña específica, así que he estado intentándolo con wp_check_password
pero la cuenta que se está comprobando se desconecta y no puede iniciar sesión nuevamente hasta que haya una llamada a wp_check_password
en el código.
Investigando en el código, descubrí que establece la contraseña utilizando el nuevo hash. Y además, si estoy usando wp_check_password( 'hola', md5('hola'), 1 );
, ni siquiera verifica lo que hay dentro de la base de datos y devuelve true. ¿No es esto un error?
¿Alguna idea de cómo puedo verificar la contraseña del usuario?

Tu ejemplo funciona correctamente. Estás verificando si la contraseña hello
coincide con el hash de hello
- lo cual naturalmente hace.
No lo había pensado bien. Tu ejemplo causa el siguiente problema:
- Verificas si
hello
coincide con el md5 dehello
(en lugar del hash del perfil del usuario). - Coincide y entonces WP piensa que es correcto, pero como un hash md5 obsoleto que debe actualizarse. >3. Vuelve a hashear
hello
y actualiza al usuario con él, bloqueando su acceso (ya que su contraseña ahora es hello
en lugar de lo que fuera antes).
Revisa la función wp_authenticate_username_password()
para un ejemplo extenso, pero la idea básica es:
$userdata = get_user_by('login', $username);
$result = wp_check_password($password, $userdata->user_pass, $userdata->ID);

Pero no coincide en todas las circunstancias, que es lo que asumí que era el problema. Por un lado, la función de hash de contraseña es intercambiable, por lo que no necesariamente usa md5 (de hecho, no creo que lo haga por defecto - el predeterminado es phpass).

@goldenapples no tiene sentido sobreescribir wp_hash_password()
y dejar wp_check_password()
. ¿La falta de coincidencia del hash simplemente no permitirá que nadie pase la verificación, no? :)

Oh, tienes razón. wp_check_password()
funcionará de la manera en que lo estabas usando en tu respuesta. Me refería a su pregunta original, verificando 'hello' contra el md5 de 'hello', lo cual fallará a menos que md5 sea el algoritmo realmente usado en wp_hash_password
...

@goldenapples la función nativa wp_hash_password()
sí soporta md5 por compatibilidad hacia atrás, vuelve a hashear esas contraseñas al verificarlas. Ahora que lo pienso, este es probablemente el problema en la pregunta original...

Sí, si las dos contraseñas proporcionadas coinciden usando md5, wp_check_password restablecerá la contraseña del usuario usando la función de hash actual. Así que en la pregunta original, como las dos contraseñas dadas coincidían, estaba cambiando la contraseña del usuario a "hello"...

@Rarst ¡Gracias! Esto funciona. Y me preguntaba por qué tengo que proporcionar el hash yo mismo. Está ahí para mantener la compatibilidad hacia atrás, ¿verdad? De lo contrario, solo la contraseña a verificar y el ID hubieran sido suficientes.

@Ashfame las funciones relacionadas con contraseñas son deliberadamente conectables y muy flexibles, para que las personas puedan construir o integrar esquemas de autenticación alternativos sin muchos problemas.

@Rarst ¿Quieres decir que es para hacerlo conectable y no para mantener compatibilidad con versiones anteriores de diferentes hashes?

@Ashfame solo es compatible con versiones anteriores con md5, porque eso es lo que WordPress usaba en el pasado.

Puedes obtener la contraseña cifrada del usuario desde la base de datos y compararla con la entrada que deseas verificar usando wp_hash_password().
Para verificar si la contraseña del usuario actual coincide con "hello", prueba esto:
if ( $current_user->user_pass == wp_hash_password( 'hello' ) )

if ( wp_hash_password( $xx_new_password ) != $xx_userinfo->user_pass )
funciona de manera diferente a if ( !wp_check_password( $xx_new_password, $xx_userinfo->user_pass , $xx_id ) )
¡Qué raro! Gracias por tu ayuda.

require_once ABSPATH . WPINC . '/class-phpass.php';
$wp_hasher = new PasswordHash(8, TRUE);
$password_hashed = '$P$BB3pP6fQAYa61ael0LNQlpB1NOyqNY0';
$plain_password = 'admin2';
if($wp_hasher->CheckPassword($plain_password, $password_hashed)) {
print 'Contraseña coincide.';
}
Créditos a: https://stackoverflow.com/a/37181662
