php mysqli_connect: método de autenticación desconocido para el cliente [caching_sha2_password]

95

Estoy usando php mysqli_connectpara iniciar sesión en una base de datos MySQL (todo en localhost)

<?php
//DEFINE ('DB_USER', 'user2');
//DEFINE ('DB_PASSWORD', 'pass2');
DEFINE ('DB_USER', 'user1');
DEFINE ('DB_PASSWORD', 'pass1');
DEFINE ('DB_HOST', '127.0.0.1');
DEFINE ('DB_NAME', 'dbname');

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if(!$dbc){
    die('error connecting to database');    
}
?>

esta es la tabla mysql.user: tabla mysql.user

Archivo ini del servidor MySQL:

[mysqld]
# The default authentication plugin to be used when connecting to the server
default_authentication_plugin=caching_sha2_password
#default_authentication_plugin=mysql_native_password

con caching_sha2_passworden el archivo ini servidor MySQL, no es posible en absoluto a la sesión con usuario1 usuario2 o;

error: mysqli_connect (): El servidor solicitó un método de autenticación desconocido para el cliente [caching_sha2_password] en ...

con mysql_native_passworden el archivo ini de MySQL Server, es posible iniciar sesión con user1, pero con user2, el mismo error;


¿Cómo puedo iniciar sesión caching_sha2_passworden mySql Server?

Guti_Haz
fuente
¿PDO lo admite? He visto otros informes sobre mysqli.
tadman
La respuesta publicada por @ 黃皓哲 debe marcarse como respuesta aceptada.
FIL

Respuestas:

53

A partir de PHP 7.4, esto ya no es un problema. Se caching_sha2ha agregado soporte para el método de autenticación a mysqlnd.


Actualmente, la extensión PHP mysqli no admite la nueva función de autenticación caching_sha2. Tienes que esperar hasta que publiquen una actualización.

Consulte la publicación relacionada de los desarrolladores de MySQL: https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

No mencionaron PDO, tal vez debería intentar conectarse con PDO.

abeyaz
fuente
3
PDO tiene el mismo problema
Machavity
@Machavity, ¿sabes si esta respuesta sigue siendo válida? Es decir. ¿Aún no está desactualizado con las versiones más recientes de PHP?
gen
@gen Basado en este error , parece que funciona a partir de 7.4.2
Machavity
3
La actualización a php7.4 resolvió el problema. Y creo que ese es el mejor enfoque en lugar de cambiar el método de autenticación mysql_native_passwordcomo lo sugieren algunas respuestas.
Ultrasamad
Utilizo Docker (apache + php en un contenedor y mysql en otro contenedor) y esto resolvió mi problema. ¡Gracias!
Joan Galmés Riera
227

Resuelvo esto con el comando SQL:

ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

al que se hace referencia en https://dev.mysql.com/doc/refman/8.0/en/alter-user.html

si está creando un nuevo usuario

 CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

al que hace referencia https://dev.mysql.com/doc/refman/8.0/en/create-user.html

esto funciona para mi

黃皓哲
fuente
3
Buena respuesta. El problema aquí es que es posible que tenga que hacer esto cada vez que agrega un nuevo usuario, dependiendo de la configuración del servidor
Machavity
3
Muchas gracias. Estaba buscando una manera de convertir los nuevos hashes de contraseña a los más antiguos (como el formato de usuario2 al formato de usuario1 en la pregunta) y su respuesta hizo exactamente el trabajo
Contador م
10
Y así terminó una lucha de 4 días para que php-7.2.9 / 11 funcionara bien con MySQL-8.012. ¿Podría alguien en el equipo de PHP estar convencido de anotar esto en INSTALL en el tarball? Ahorraría miles de horas por persona durante los próximos dos años.
MountainMan
4
@MountainMan salvó mi vida
Chase
8
esto debería ser una respuesta aceptada para una solución alternativa
Yohanes AI
27
ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

Quite las comillas (') después ALTER USERy mantenga la cita (') despuésmysql_native_password BY

También me está funcionando.

Eranda J.
fuente
2
Esa fue la única solución que funcionó para mí en el servidor localhost usando el servidor WAMP :)
Jodyshop
Esto pareció solucionarlo en la configuración LAMP casera de mi Mac. Sin embargo, no experimenté este problema en Debian.
Magnus
22

Si está en Windows y no es posible utilizarlo caching_sha2_passworden absoluto, puede hacer lo siguiente:

  1. vuelva a ejecutar el instalador de MySQL
  2. seleccione "Reconfigurar" junto a MySQL Server (el elemento superior)
  3. haga clic en "Siguiente" hasta llegar a "Método de autenticación"
  4. cambie "Usar cifrado de contraseña segura para la autenticación (RECOMENDADO)" a "Usar método de autenticación heredado (Conservar la compatibilidad con MySQL 5.X)
  5. haga clic en Siguiente"
  6. ingrese la contraseña de su cuenta raíz en Cuentas y funciones y haga clic en "Verificar"
  7. haga clic en Siguiente"
  8. siga haciendo clic en "Siguiente" hasta llegar a "Aplicar configuración"
  9. haga clic en "Ejecutar"

El instalador realizará todos los cambios de configuración necesarios para usted.

CJ Dennis
fuente
hombre después de un año de votar a favor de esta respuesta, mi base de datos fue pirateada ...
Code Tree
11

Me está funcionando (PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64bits)

Edite el archivo C:\ProgramData\MySQL\MySQL Server 8.0\my.ini:

default_authentication_plugin=mysql_native_password

Restablecer el servicio MySQL en Windows y en MySQL Shell ...

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
Chinnon Santos
fuente
funciona, gracias ... debemos configurar que 2 cosas: mysql conf y alter user
danisupr4
9

Como mucha gente, he tenido el mismo problema. Aunque el usuario está configurado para usar mysql_native_password, y puedo conectarme desde la línea de comando, la única forma en que puedo hacer que mysqli () se conecte es agregar

plugin-autenticación-predeterminado = mysql_native_password

a la sección [mysqld] de, en mi configuración en ubuntu 19.10, /etc/mysql/mysql.conf.d/mysqld.cnf

dBags
fuente
2
Además, tenga en cuenta que si el usuario se crea antes de este cambio, no funcionará. Por lo tanto, ¡PRIMERO debe establecer la autenticación predeterminada en la configuración y luego crear el usuario para que funcione!
Oleg Popov
4

Ejecuté el siguiente comando ALTER USER 'root' @ 'localhost' identified with mysql_native_password BY 'root123';en la línea de comandos y finalmente reinicié MySQL en los servicios locales.

JRonald Moreno
fuente
no se 'root' @ 'localhost'deben leer espacios aquí en su lugarALTER USER 'root'@'localhost' identified with mysql_native_password BY 'root123';
d1jhoni1b
4

Ahora puede actualizar a PHP7.4 y MySQL irá caching_sha2_passwordde forma predeterminada, por lo que la instalación predeterminada de MySQL funcionará mysqli_connectsin necesidad de configuración.

Pavel Niedoba
fuente
2
No exactamente. Tiene errores en 7.4.0 y 7.4.1. Corregido en 7.4.2
Machavity
3

Si está en una Mac, aquí le mostramos cómo solucionarlo. Esto es después de toneladas de prueba y error. Espero que esto ayude a otros ...

Depuración:

$mysql --verbose --help | grep my.cnf

$ which mysql
/usr/local/bin/mysql

Resolución: nano /usr/local/etc/my.cnf

Agregar: default-authentication-plugin = mysql_native_password

-------
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
default-authentication-plugin=mysql_native_password
------

Finalmente ejecutar: brew services reiniciar mysql

kp123
fuente
Necesitaba esto ... ¡Gracias!
nykc
1

Probé esto en Ubuntu 18.04 y es la única solución que funcionó para mí:

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
imjesr
fuente
-4

Creo que no es útil configurar el servidor mysql sin el cifrado caching_sha2_password, tenemos que buscar la forma de publicar, enviar u obtener información segura a través de la red. Como puede ver en el código a continuación, no uso la variable $ db_name, y estoy usando un usuario en el servidor mysql con una contraseña de configuración estándar. Simplemente cree una contraseña de usuario estándar y configure todos los privilegios. funciona, pero como dije sin seguridad.

<?php
$db_name="db";
$mysql_username="root";
$mysql_password="****";
$server_name="localhost";
$conn=mysqli_connect($server_name,$mysql_username,$mysql_password);

if ($conn) {
    echo "connetion success";
}
else{
    echo mysqli_error($conn);
}

?>
Steven Canales
fuente