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_passwordв іні файлі MySQL сервера, це взагалі неможливо увійти з user1 або user2;

помилка: mysqli_connect (): Сервер запитував метод автентифікації, невідомий клієнту [caching_sha2_password] у ...

з mysql_native_passwordв іні файлі MySQL сервера, то можна увійти в систему з user1, але з user2, та ж помилка;


як я можу увійти, використовуючи caching_sha2_passwordсервер mySql?


Чи підтримує це PDO? Я бачив інші повідомлення про mysqli.
tadman

Відповідь, опубліковану @ 黃皓哲, слід позначити як прийняту відповідь.
FIL

Відповіді:


53

Починаючи з PHP 7.4, це вже не проблема. Підтримка caching_sha2методу автентифікації додана до mysqlnd.


Наразі розширення PHP mysqli не підтримує нову функцію автентифікації caching_sha2. Потрібно почекати, поки вони випустять оновлення.

Перевірте відповідне повідомлення від розробників MySQL: https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

Вони не згадували PDO, можливо, вам слід спробувати встановити зв’язок з PDO.



@Machavity чи знаєте ви, чи ця відповідь все ще дійсна? Тобто. він ще не застарів із новішими версіями PHP?
ген

@gen На основі цієї помилки , схоже, вона працює станом на 7.4.2
Machavity

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
І так закінчилася 4-денна боротьба за те, щоб php-7.2.9 / 11 добре грав з MySQL-8.012. Чи міг хтось із команди PHP переконати це відзначити у ВСТАНОВЛЕННІ в tarball? Це дозволить заощадити тисячі людських годин протягом наступного року-двох.
MountainMan

4
@MountainMan врятував мені життя
Чейз

8
це має бути прийнятою відповіддю на вирішення обхідного
Йоханес А.І.

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

Видаліть лапки (') після ALTER USERі збережіть лапки (') післяmysql_native_password BY

Це працює і на мене.


2
Це було єдине рішення, яке працювало для мене на сервері localhost за допомогою сервера WAMP :)
Jodyshop

Здавалося, це виправлено у налаштуваннях домашнього зв’язку LAMP мого Mac. Не відчував цієї проблеми на debian.
Магнус

22

Якщо ви працюєте в ОС Windows, і це взагалі неможливо використовувати caching_sha2_password, ви можете зробити наступне:

  1. перезапустити інсталятор MySQL
  2. виберіть "Налаштувати" поруч із сервером MySQL (верхній пункт)
  3. натискайте "Далі", поки не перейдете до "Метод автентифікації"
  4. змінити «Використовувати надійне шифрування пароля для автентифікації (РЕКОМЕНДОВАНО)» на «Використовувати застарілий метод автентифікації (зберегти сумісність MySQL 5.X)
  5. натисніть "Далі"
  6. введіть свій пароль для кореневого облікового запису в «Облікові записи та ролі» та натисніть «Перевірити»
  7. натисніть "Далі"
  8. продовжуйте натискати "Далі", поки не перейдете до "Застосувати конфігурацію"
  9. натисніть "Виконати"

Інсталятор внесе всі необхідні для вас зміни конфігурації.


людина після року голосування за цю відповідь мою базу даних зламали ...
Дерево кодів

11

Це працює для мене (PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64bit)

Відредагуйте файл 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';

це працює, дякую ... ми повинні налаштувати дві речі: mysql conf та alter user
danisupr4

9

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

default-authentication-plugin = mysql_native_password

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


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

Додайте: плагін автентифікації за замовчуванням = 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
------

Нарешті, запустіть: служби заварювання перезапустіть mysql


Потрібно це ... Дякую!
nykc

1

Я спробував це в Ubuntu 18.04 і є єдиним рішенням, яке працювало для мене:

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';

-4

Я думаю, що корисно налаштовувати сервер mysql без шифрування caching_sha2_password, нам потрібно знайти спосіб опублікувати, надіслати або отримати захищену інформацію через мережу. Як ви бачите в коді нижче, я не використовую змінну $ db_name, а я використовую користувача на сервері mysql зі стандартним паролем конфігурації. Просто створіть пароль користувача Standar і налаштуйте всі права. це працює, але як я сказав без безпечності.

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

?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.