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 должно работать!