php mysqli_connect: метод аутентификации неизвестен клиенту [caching_sha2_password]

95

Я использую php mysqli_connectдля входа в базу данных MySQL (все на 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');    
}
?>

это таблица mysql.user: таблица mysql.user

INI-файл сервера 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

с caching_sha2_passwordini-файлом MySQL Server вообще невозможно войти в систему с пользователем user1 или user2;

ошибка: mysqli_connect (): сервер запросил метод аутентификации, неизвестный клиенту [caching_sha2_password] в ...

с mysql_native_passwordini-файлом MySQL Server можно войти в систему с пользователем user1, но с user2 та же ошибка;


как я могу войти с помощью caching_sha2_passwordна сервере mySql?

Guti_Haz
источник
Поддерживает ли это PDO? Я видел другие отчеты о mysqli.
tadman
Ответ, отправленный @ 黃皓哲, должен быть помечен как принятый.
FIL

Ответы:

53

Начиная с PHP 7.4, это больше не проблема. В caching_sha2mysqlnd добавлена поддержка метода аутентификации.


В настоящее время расширение PHP mysqli не поддерживает новую функцию аутентификации caching_sha2. Вам нужно подождать, пока они не выпустят обновление.

Проверьте соответствующий пост от разработчиков MySQL: https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

Они не упомянули PDO, возможно, вам стоит попробовать подключиться к PDO.

Abeyaz
источник
@Machavity вы знаете, действителен ли этот ответ? Т.е. он еще не устарел с более новыми версиями PHP?
генерал,
@gen Судя по этой ошибке , похоже, что она работает с
версии
3
Обновление до php7.4 решило проблему. И я думаю, что это лучший подход, а не изменение метода аутентификации, mysql_native_passwordкак предлагается в некоторых ответах.
Ultrasamad
Я использую докер (apache + php в контейнере и mysql в другом контейнере), и это решило мою проблему. Благодарность!
Жоан Гальмес Риера,
227

Я решаю это с помощью команды SQL:

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

на который ссылается https://dev.mysql.com/doc/refman/8.0/en/alter-user.html

если вы создаете нового пользователя

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

на который ссылается https://dev.mysql.com/doc/refman/8.0/en/create-user.html

это работает для меня

黃皓哲
источник
3
Хороший ответ. Проблема в том, что вам, возможно, придется делать это каждый раз, когда вы добавляете нового пользователя, в зависимости от настроек сервера
Machavity
3
Большое спасибо, я искал способ преобразовать новые хэши паролей в старые (например, из формата user2 в формат user1 в вопросе), и ваш ответ сработал именно так,
Бухгалтер م
10
Так закончилась четырехдневная борьба за то, чтобы php-7.2.9 / 11 хорошо работал с MySQL-8.012. Можно ли убедить кого-нибудь из команды PHP отметить это в INSTALL в архиве? Это сэкономит тысячи человеко-часов в течение ближайшего года или двух.
MountainMan
4
@MountainMan спас мне жизнь
Чейз
8
это должен быть принятый ответ для обходного решения
Йоханес AI
27
ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

Удалить кавычки (') после ALTER USERи оставить кавычки (') послеmysql_native_password BY

У меня это тоже работает.

Эранда Дж.
источник
2
Это было единственное решение,
сработавшее
Похоже, это исправило это в настройке LAMP моего доморощенного Mac. Однако не испытывал этой проблемы на debian.
Магнус
22

Если вы используете Windows и ее вообще невозможно использовать caching_sha2_password, вы можете сделать следующее:

  1. перезапустите установщик MySQL
  2. выберите "Reconfigure" рядом с MySQL Server (верхний элемент)
  3. нажимайте «Далее», пока не дойдете до «Метод аутентификации»
  4. измените «Использовать надежное шифрование паролей для аутентификации (РЕКОМЕНДУЕТСЯ)» на «Использовать устаревший метод аутентификации (сохранить совместимость с MySQL 5.X).
  5. Нажмите кнопку "Далее"
  6. введите пароль своей корневой учетной записи в разделе «Учетные записи и роли» и нажмите «Проверить».
  7. Нажмите кнопку "Далее"
  8. продолжайте нажимать «Далее», пока не дойдете до «Применить конфигурацию»
  9. нажмите "Выполнить"

Установщик внесет все необходимые изменения в конфигурацию.

CJ Деннис
источник
человек после года голосования за этот ответ мой db был взломан ...
Code Tree
11

Он работает для меня (PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64 бит)

Отредактируйте файл C:\ProgramData\MySQL\MySQL Server 8.0\my.ini:

default_authentication_plugin=mysql_native_password

Сброс службы MySQL в Windows и в оболочке MySQL ...

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
Шиннон Сантос
источник
это работает, спасибо ... мы должны настроить эти 2 вещи: mysql conf и alter user
danisupr4
9

Как и у многих людей, у меня была такая же проблема. Хотя пользователь настроен на использование mysql_native_password, и я могу подключиться из командной строки, единственный способ заставить mysqli () подключиться - это добавить

плагин-аутентификации по умолчанию = mysql_native_password

в раздел [mysqld] в моей настройке на ubuntu 19.10, /etc/mysql/mysql.conf.d/mysqld.cnf

dBags
источник
2
Также имейте в виду, что если пользователь будет создан до этого изменения, это не сработает. Итак, вы должны СНАЧАЛА установить аутентификацию по умолчанию в конфигурации, а затем создать пользователя для работы!
Олег Попов
4

Я выполнил следующую команду ALTER USER 'root' @ 'localhost' identified with mysql_native_password BY 'root123';в командной строке и, наконец, перезапустил MySQL в локальных службах.

Дж. Рональд Морено
источник
'root' @ 'localhost'вместо этого здесь не следует читать ALTER USER 'root'@'localhost' identified with mysql_native_password BY 'root123';
пробелы
4

Теперь вы можете выполнить обновление до PHP7.4, и MySQL будет работать caching_sha2_passwordпо умолчанию, поэтому установка MySQL по умолчанию mysqli_connectне требует настройки.

Павел Ниедоба
источник
2
Не совсем. Глючит в 7.4.0 и 7.4.1. Исправлено в 7.4.2
Machavity
3

Если вы используете Mac, вот как это исправить. Это после множества проб и ошибок. Надеюсь, это поможет другим ..

Отладка:

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

$ which mysql
/usr/local/bin/mysql

Разрешение: nano /usr/local/etc/my.cnf

Добавить: 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
------

Наконец, запустите: brew services перезапустите mysql

kp123
источник
Это было нужно ... Спасибо!
nykc,
1

Я пробовал это в Ubuntu 18.04, и это единственное решение, которое сработало для меня:

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
Imjesr
источник
-4

Я думаю, что бесполезно настраивать сервер mysql без шифрования caching_sha2_password, мы должны найти способ публиковать, отправлять или получать безопасную информацию через сеть. Как вы видите в приведенном ниже коде, я не использую переменную $ db_name, а я использую пользователя на сервере mysql со стандартным паролем конфигурации. Просто создайте стандартный пароль пользователя и настройте все привилегии. это работает, но как я уже сказал без секретов.

<?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);
}

?>
Стивен Каналес
источник