php mysqli_connect: método de autenticação desconhecido para o cliente [caching_sha2_password]

101

Estou usando php mysqli_connectpara fazer login em um banco de dados MySQL (tudo em 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 é a tabela mysql.user: tabela mysql.user

Arquivo ini do 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

com caching_sha2_passwordo arquivo ini do MySQL Server, não é possível fazer o login com o usuário1 ou usuário2;

erro: mysqli_connect (): O servidor solicitou método de autenticação desconhecido para o cliente [caching_sha2_password] em ...

com mysql_native_passwordno arquivo ini do MySQL Server, é possível fazer o login com user1, mas com user2, mesmo erro;


como posso fazer o login usando caching_sha2_passwordno servidor mySql?

Guti_Haz
fonte
O PDO suporta isso? Eu vi outros relatórios sobre mysqli.
tadman
A resposta postada por @ 黃皓哲 deve ser marcada como resposta aceita.
FIL

Respostas:

56

A partir do PHP 7.4, isso não é mais um problema. Suporte para caching_sha2método de autenticação foi adicionado ao mysqlnd.


Atualmente, a extensão PHP mysqli não suporta o novo recurso de autenticação caching_sha2. Você tem que esperar até que eles lançem uma atualização.

Verifique a postagem relacionada de desenvolvedores MySQL: https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

Eles não mencionaram o PDO, talvez você deva tentar se conectar com o PDO.

Abeyaz
fonte
3
O PDO tem o mesmo problema
Machavity
@Machavity você sabe se esta resposta ainda é válida? Ie. ainda não está desatualizado com as versões mais recentes do PHP?
gen
@gen: Com base neste bug , parece que está funcionando a partir de 7.4.2
Machavity
3
Atualizar para php7.4 resolve o problema. E acho que essa é a melhor abordagem, em vez de alterar o método de autenticação mysql_native_passwordconforme sugerido por algumas respostas.
ultrasamad
Eu uso docker (apache + php em um contêiner e mysql em outro contêiner) e isso resolveu meu problema. Obrigado!
Joan Galmés Riera
235

Eu resolvo isso pelo comando SQL:

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

que é referenciado por https://dev.mysql.com/doc/refman/8.0/en/alter-user.html

se você estiver criando um novo usuário

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

que é referenciado por https://dev.mysql.com/doc/refman/8.0/en/create-user.html

isso funciona para mim

黃皓哲
fonte
3
Boa resposta. A pegadinha aqui é que você pode ter que fazer isso sempre que adicionar um novo usuário, dependendo das configurações do servidor
Machavity
3
Muito obrigado, eu estava procurando uma maneira de converter os novos hashes de senha para os mais antigos (como o formato user2 para o formato user1 na pergunta) e sua resposta fez exatamente o trabalho
Contador م
10
E assim terminou uma luta de 4 dias para fazer o php-7.2.9 / 11 funcionar bem com o MySQL-8.012. Alguém da equipe do PHP poderia ser convencido a notar isso no INSTALL no tarball? Isso economizaria milhares de horas por pessoa nos próximos um ou dois anos.
MountainMan
4
@MountainMan Saved my life
Chase
8
esta deve ser a resposta aceita para solução alternativa
Yohanes AI
29
ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

Remova as aspas (') após ALTER USERe mantenha aspas (') apósmysql_native_password BY

Está funcionando para mim também.

Eranda J.
fonte
2
Essa foi a única solução que funcionou para mim no servidor localhost usando o servidor WAMP :)
Jodyshop
Isso pareceu consertá-lo na configuração de homebrew LAMP do meu Mac. Não tive esse problema no debian.
Magnus
23

Se você estiver no Windows e não for possível usá caching_sha2_password-lo, faça o seguinte:

  1. execute novamente o instalador do MySQL
  2. selecione "Reconfigurar" próximo ao Servidor MySQL (o item superior)
  3. clique em "Avançar" até chegar ao "Método de autenticação"
  4. altere "Usar criptografia de senha forte para autenticação (RECOMENDADO)" para "Usar método de autenticação herdado (manter compatibilidade com MySQL 5.X)
  5. clique em "Avançar"
  6. insira a senha da sua conta Root em contas e funções e clique em "Verificar"
  7. clique em "Avançar"
  8. continue clicando em "Avançar" até chegar a "Aplicar configuração"
  9. clique em "Executar"

O instalador fará todas as alterações de configuração necessárias para você.

CJ Dennis
fonte
cara, depois de um ano a favor desta resposta, meu banco de dados foi hackeado ...
Code Tree
12

Está funcionando para mim (PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64bits)

Edite o arquivo C:\ProgramData\MySQL\MySQL Server 8.0\my.ini:

default_authentication_plugin=mysql_native_password

Redefina o serviço MySQL no Windows e no MySQL Shell ...

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
Chinnon Santos
fonte
funciona, obrigado ... devemos configurar 2 coisas: mysql conf e alter user
danisupr4
9

Como muitas pessoas, tive o mesmo problema. Embora o usuário esteja configurado para usar mysql_native_password, e eu possa conectar a partir da linha de comando, a única maneira de fazer com que mysqli () se conecte é adicionando

default-authentication-plugin = mysql_native_password

para a seção [mysqld] de, em minha configuração no ubuntu 19.10, /etc/mysql/mysql.conf.d/mysqld.cnf

dBags
fonte
2
Além disso, lembre-se de que se o usuário for criado antes dessa alteração, ele não funcionará. Portanto, você deve PRIMEIRO definir a autenticação padrão na configuração e, em seguida, criar o usuário para funcionar!
Oleg Popov
4

Executei o seguinte comando ALTER USER 'root' @ 'localhost' identified with mysql_native_password BY 'root123';na linha de comando e finalmente reiniciei o MySQL nos serviços locais.

JRonald Moreno
fonte
nenhum espaço aqui 'root' @ 'localhost'deve ser lido em vez dissoALTER USER 'root'@'localhost' identified with mysql_native_password BY 'root123';
d1jhoni1b
4

Agora você pode atualizar para o PHP7.4 e o MySQL irá acompanhá-lo caching_sha2_passwordpor padrão, então a instalação padrão do MySQL funcionará com mysqli_connectNenhuma configuração necessária.

Pavel Niedoba
fonte
2
Não exatamente. É bugado em 7.4.0 e 7.4.1. Corrigido em 7.4.2
Machavity
3

Se você estiver em um Mac, veja como consertar. Isso depois de toneladas de tentativa e erro. Espero que isso ajude outras pessoas ..

Depurando:

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

$ which mysql
/usr/local/bin/mysql

Resolução: nano /usr/local/etc/my.cnf

Adicione: 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 execute: brew services restart mysql

kp123
fonte
Precisava disso ... Obrigado!
nykc
1

Eu tentei isso no Ubuntu 18.04 e é a única solução que funcionou para mim:

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

Eu acho que não é útil configurar o servidor mysql sem criptografia caching_sha2_password, temos que encontrar uma maneira de publicar, enviar ou obter informações seguras através da rede. Como você pode ver no código abaixo, eu não uso a variável $ db_name e estou usando um usuário no servidor mysql com senha de configuração padrão. Basta criar uma senha de usuário padrão e configurar todos os privilégios. funciona, mas como disse sem segurança.

<?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
fonte