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

Я новичок 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

Ответы

Ответ 1

Выполните следующий запрос в MYSQL Workbench

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'

Где root качестве вашего пользователя localhost качестве вашего URL и password качестве вашего пароля

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

Ответ 2

Использование старого 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 еще не реализована. Вы можете увидеть этот запрос на растяжение и эту проблему для получения дополнительной информации. Вероятно, исправить скоро!

Ответ 3

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

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]';

Ответ 4

Полные шаги для 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

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

Ответ 5

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

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';

Ответ 6

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ура!

Ответ 7

Оригинальную документацию вы можете найти здесь: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/

'use strict';

const mysqlx = require('@mysql/xdevapi');

const options = {
  host: 'localhost',
  port: 33060,
  password: '******',
  user: 'root',
  schema: 'yourconference'
};

mysqlx.getSession(options)
  .then(session => {
          console.log(session.inspect());
           session.close();
  }).catch(err => {
    console.error(err.stack);
    process.exit(1);
  });

Ответ 8

У меня MYSQL на сервере и приложение nodejs на другом сервере

Выполните следующий запрос в MYSQL Workbench

ALTER USER 'root' @'%' ИДЕНТИФИЦИРОВАНО С mysql_native_password BY 'password'

Ответ 9

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

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

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

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

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

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

Ответ 10

Просто запустите установщик MySQL Server и переконфигурируйте мой SQL Server... Это сработало для меня.

Ответ 11

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

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

Ответ 12

Способ, которым он в настоящее время структурирован, ожидает соединение сокета. Просто измените хост с localhost на 127.0.0.1 как показано ниже, чтобы использовать стандартное соединение. Вы также должны будете предоставить порт. Порт по умолчанию - 3306

Ответ 13

Если вы столкнулись с этой ошибкой, но все еще хотите использовать MySQL версии 8. Вы можете сделать это, сказав MySQL Server использовать устаревший плагин аутентификации при создании базы данных с помощью Docker.

Итак, ваш составной файл будет выглядеть так:

# Use root/example as user/password credentials

version: '3.1'

services:

  db:
    image: mysql:8.0.15
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
       MYSQL_ROOT_PASSWORD: 'pass'
       MYSQL_DATABASE: 'db'
       MYSQL_USER: 'user'
       MYSQL_PASSWORD: 'pass'
    ports:
      - 3318:3306
    # Change this to your local path
    volumes:
      - ~/Database/ORM_Test:/var/lib/mysql

Ответ 14

Проверьте привилегии и имя пользователя/пароль для вашего пользователя 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!");
});

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

Ответ 15

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

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

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

3) Найдите "Сервер MySQL" и нажмите "Переконфигурировать" step 3

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

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

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

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

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