mysql - the server requested authentication method unknown to the client[caching_sha2_password]




MySQL 8.0-клиент не поддерживает протокол аутентификации, запрашиваемый сервером; рассмотреть вопрос об обновлении клиента MySQL (10)

Я новичок в node.js и MySQL, и я только начал настраивать и пробовать базовый код. Однако по какой-то причине я не могу установить даже простое соединение с сервером. Я устанавливаю новейшую базу данных MySQL Community 8.0 вместе с Node.JS с настройками по умолчанию.

Это мой код node.js

    var mysql = require('mysql');

    var con = mysql.createConnection({
      host: "localhost",
      user: "root",
      password: "password",
      insecureAuth : true
    });

    con.connect(function(err) {
      if (err) throw err;
      console.log("Connected!");
    });

Ниже приведена ошибка в командной строке:

C:\Users\mysql-test>node app.js
    C:\Users\mysql-test\node_modules\mysql\lib\protocol\Parse
    r.js:80
            throw err; // Rethrow non-MySQL errors
            ^

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    at Handshake.Sequence._packetToError (C:\Users\mysql-
test\node_modules\mysql\lib\protocol\sequences\Sequence.js:52:14)
    at Handshake.ErrorPacket (C:\Users\mysql-test\node_mo
dules\mysql\lib\protocol\sequences\Handshake.js:130:18)
    at Protocol._parsePacket (C:\Users\mysql-test\node_mo
dules\mysql\lib\protocol\Protocol.js:279:23)
    at Parser.write (C:\Users\mysql-test\node_modules\mys
ql\lib\protocol\Parser.js:76:12)
    at Protocol.write (C:\Users\mysql-test\node_modules\m
ysql\lib\protocol\Protocol.js:39:16)
    at Socket.<anonymous> (C:\Users\mysql-test\node_modul
es\mysql\lib\Connection.js:103:28)
    at Socket.emit (events.js:159:13)
    at addChunk (_stream_readable.js:265:12)
    at readableAddChunk (_stream_readable.js:252:11)
    at Socket.Readable.push (_stream_readable.js:209:10)
    --------------------
    at Protocol._enqueue (C:\Users\mysql-test\node_module
s\mysql\lib\protocol\Protocol.js:145:48)
    at Protocol.handshake (C:\Users\mysql-test\node_modul
es\mysql\lib\protocol\Protocol.js:52:23)
    at Connection.connect (C:\Users\mysql-test\node_modul
es\mysql\lib\Connection.js:130:18)
    at Object.<anonymous> (C:\Users\mysql-test\server.js:
11:5)
at Module._compile (module.js:660:30)
at Object.Module._extensions..js (module.js:671:10)
at Module.load (module.js:573:32)
at tryModuleLoad (module.js:513:12)
at Function.Module._load (module.js:505:3)
at Function.Module.runMain (module.js:701:10)

Я читал о некоторых вещах, таких как: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507

Но я все еще не уверен, как решить мою проблему. Любая помощь будет оценена: D


Полные шаги для MySQL 8

Подключиться к MySQL

$ mysql -u root -p
Enter password: (enter your root password)

Сбросить пароль

(Замените your_new_password на пароль, который вы хотите использовать)

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
mysql> FLUSH PRIVILEGES;
mysql> quit

Затем попробуйте подключиться с помощью узла


В Mysql Последний докер контейнер

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';

Давайте сначала проясним, что происходит.

MySQL 8 поддерживает подключаемые методы аутентификации. По умолчанию, один из них называется caching_sha2_password а не наш старый добрый mysql_native_password ( source ). Должно быть очевидно, что использование криптоалгоритма с несколькими рукопожатиями является более безопасным, чем простая передача пароля, которая была там 24 года !

Теперь проблема в mysqljs в Node (пакет, который вы устанавливаете с помощью npm i mysql и используете его в своем коде Node), пока не поддерживает этот новый метод аутентификации по умолчанию в MySQL 8. Проблема находится здесь: https://github.com/mysqljs/mysql/issues/1507 и по-прежнему открыта через 3 года, начиная с июля 2019 года. этот!)

Ваши варианты

Вариант 1) Понизьте версию «MySQL» для аутентификации, используя старый добрый «native_password»

Это то, что все предлагают здесь (например, верхний ответ выше ). Вы просто входите в mysql и запускаете запрос, в котором говорится, что root в порядке, используя старый метод native_password для аутентификации:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...

Хорошо, что жизнь будет простой, и вы все равно сможете без проблем использовать старые добрые инструменты, такие как Sequel Pro. Но проблема в том, что вы не используете более безопасные (и крутые, читайте ниже) материалы, доступные вам.

Вариант 2) Замените пакет "Node" на MySQL Connecter X DevAPI

MySQL X DevAPI для Node является заменой пакета Node's Mysqljs , предоставленного официальными парнями http://dev.mysql.com .

Это работает как шарм, поддерживающий аутентификацию caching_sha2_password . (Просто убедитесь, что вы используете порт 33060 для обмена данными по протоколу X ).

Плохо то, что вы оставили наш старый пакет mysql , к которому так привыкли все.

Хорошо, что ваше приложение теперь более защищено, и вы можете воспользоваться кучей новых вещей, которые не давали наши старые добрые друзья! Просто ознакомьтесь с руководством по X DevAPI, и вы увидите, что в нем есть масса новых сексуальных функций, которые могут пригодиться. Вам просто нужно заплатить цену обучения, которая, как ожидается, идет с любым обновлением технологии. :)

PS. К сожалению, в этом пакете XDevAPI еще нет определения типов (что понятно с помощью TypeScript), поэтому, если вы набираете текст , у вас будут проблемы. Я пытался сгенерировать .d.ts, используя dts-gen и dtsmake , но безуспешно. Так что имейте это в виду.

Ура!


Для существующих MySQL 8.0 устанавливается на Windows 10 MySQL,

(1) запустить установщик,

(2) нажмите «Переконфигурировать» под QuickAction (слева от MySQL Server), затем

(3) нажмите рядом, чтобы пройти через следующие 2 экрана до прибытия

(4) в разделе «Метод аутентификации» выберите «Использовать устаревший метод аутентификации (сохранить совместимость с MySQL 5.x»).

(5) Продолжайте нажимать, пока установка не будет завершена


Если командная строка ALTER USER ... не работает для вас И если вы используете Windows 10, попробуйте выполнить следующие действия:

1) Введите MySQL в строке поиска Windows

2) Откройте установщик MySQL для Windows - сообщество

3) Найдите «MySQL server» и нажмите «Reconfigure».

4) Нажимайте «Далее», пока не дойдете до этапа «Метод аутентификации».

5) На этапе «Метод аутентификации» проверьте второй параметр «Использовать устаревший метод аутентификации»

6) Затем следуйте инструкциям установщика Windows до конца

7) Когда это будет сделано, перейдите в «Службы» в строке поиска Windows, нажмите «Пуск» MySql81 ».

Теперь попробуйте еще раз, соединение между MySQL и Node.js должно работать!


Использование старого mysql_native_password работает:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourRootPassword';
-- or
CREATE USER 'foo'@'%' IDENTIFIED WITH mysql_native_password BY 'bar';
-- then
FLUSH PRIVILEGES;

Это потому, что caching_sha2_password введен в MySQL 8.0, но версия Node.js еще не реализована. Вы можете увидеть этот запрос и эту проблему для получения дополнительной информации. Вероятно, исправление придет в ближайшее время!


Проверьте привилегии и имя пользователя / пароль для вашего пользователя MySQL.

Для отлова ошибок всегда полезно использовать переопределенный метод _delegateError . В вашем случае это должно выглядеть так:

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "password",
  insecureAuth : true
});

var _delegateError = con._protocol._delegateError;

con._protocol._delegateError = function(err, sequence) {
    if (err.fatal)
        console.trace('MySQL fatal error: ' + err.message);

    return _delegateError.call(this, err, sequence);
};

con.connect(function(err) {
  if (err) throw err;

  console.log("Connected!");
});

Эта конструкция поможет вам отследить фатальные ошибки.


Просто запустите MySQL Server Installer и перенастройте My SQL Server ... Это сработало для меня.


У меня та же проблема с MySQL, и я решаю с помощью XAMPP для подключения к MySQL и остановки служб в Windows для MySQL (панель управления - Администрирование - Службы) и в папке db.js (которая отвечает за базу данных). сделать пароль пустым (здесь видно :)

const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: ''
});

Хотя принятый ответ правильный, я бы предпочел создать нового пользователя и затем использовать его для доступа к базе данных.

create user [email protected] identified by '[email protected]';
grant all privileges on node.* to [email protected];
ALTER USER 'nodeuser'@localhost IDENTIFIED WITH mysql_native_password BY '[email protected]';






node.js