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


274

Я не могу установить простое соединение с сервером по какой-то причине. Я устанавливаю новейшую базу данных 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


2
Все пользователи кода VS, использующие расширение SQLTools, должны обращаться к этому сообщению на случай, если у них возникнут проблемы, особенно если вы только что обновили экземпляр mysql на своем компьютере для разработки
— OzzyTheGiant

Ответы:


680

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

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

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

Затем выполните этот запрос, чтобы обновить привилегии:

flush privileges;

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

Если это не работает, попробуйте это без @'localhost'части.


47
Это сработало для меня. Не забудьте flush privileges;после.
— Али Хесари

12
У меня это работало без @localhost (наверное, потому что не для пользователя root)
— NicolasZ

10
замените «пароль» своим корневым паролем, если вы его знаете
— Vedha Peri

11
Это работает ...... но почему это не работало раньше и почему это работало после этого запроса, все еще вопрос.
— Сакшам

9
Привет @GuilhermeMatuella Это потому, что caching_sha2_passwordвведено в MySQL 8.0, но версия Node.js еще не реализована.
— Дакш Гаргас

108

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

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

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

(ОБНОВЛЕНИЕ, июнь 2019 года. В mysqljs теперь есть новый PR, чтобы исправить это! ) (ОБНОВЛЕНИЕ, февраль 2020 года: по- видимому, он должен появиться в версии 3 mysqljs . )

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

Вариант 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, но безуспешно. Так что имейте это в виду.

Ура!


3
Спасибо за размещение подробного ответа на годичный вопрос. :]
— Дакш Гаргас

3
хороший ответ, который фактически объясняет mysql_native_password вместо того, чтобы просто сказать вам это сделать
— wizloc

1
Да, правильное объяснение на этот раз. Молодец Айдин. Как я хочу, подключение приложений не автоматически настраивает порт 3306 для MySQL. У нас достаточно проблем, когда мы ценим MySQL и MariaDB от 3306.
— Ствол

Будьте осторожны с плагинами Oracle, вы можете получить большой штраф: theregister.co.uk/2019/10/04/oracle_virtualbox_merula
— Юха Унтинен

Это отличный ответ заслуживает больше голосов!
— Июнь Венстон

82

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


Работай как шарм. Какое облегчение!
— шляпа

Какая разница между добавлением @localhost и просто «root»
— filemonczyk

Запрос работает. Но все равно узел не мог подключиться к серверу MySQL. Любая идея? Вот ошибка, {"code": "ER_ACCESS_DENIED_ERROR", "errno": 1045, "sqlMessage": "Доступ запрещен для пользователя 'root' @ 'localhost' (с использованием пароля: YES)", "sqlState": "28000" , "роковой": правда}
— Санджай Прадип

26

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

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


@ мой см. мой ответ выше для деталей.
— Айдин

1
@Aidin Спасибо, это очень полезно.
— Небо

17

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

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

2
Если кто-то хочет пойти по этому пути, вот статья с некоторым объяснением: digitalocean.com/community/tutorials/…
— Девин

12

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

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

# 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

Я использую это command, но все еще получаю сообщение об ошибке неподдерживаемой аутентификации при использовании mysqlв Node.js
— Юха Унтинен

Полная трассировка стека находится здесь: pastebin.com/SzayQzdh и docker-compose.yml : pastebin.com/7pUrWYDs Сама ошибка:Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
— Юха Унтинен,

1
@JuhaUntinen убедитесь, что вы удалили контейнер Docker (созданный docker-compose) и том (~ / Database / ORM_Test), а затем снова запустите docker-compose up. В противном случае изменения из команды не будут применены. Это помогло в моем случае.
— Виталий Иванов

11

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

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';

9

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

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

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

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

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

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

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

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

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


4

В MySQL 8.0 caching_sha2_passwordэто плагин аутентификации по умолчанию, а неmysql_native_password. ...

Большинство ответов на этот вопрос приводят к переходу на механизм аутентификации с по caching_sha2_passwordк mysql_native_password. С точки зрения безопасности это весьма разочаровывает.

В этом документе подробно обсуждается caching_sha2_passwordи, конечно, почему он НЕ должен быть первым выбором для понижения метода аутентификации.

При этом я считаю, что ответ Айдина должен быть принятым ответом. Вместо понижения метода аутентификации используйте соединитель, который соответствует версии сервера.


3

Оригинальную документацию вы можете найти здесь: 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);
  });

Это выглядит сложнее, но я думаю, что мы должны следовать официальному руководству! b
— Juneyoung Oh

3

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

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

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


2

С MySQL 8+ новая аутентификация по умолчанию caching_sha2_passwordвместо mysql_native_password. Новый и более безопасный метод аутентификации еще не поддерживается собственным mysqlпакетом, но вы должны рассмотреть возможность использования пакета @mysql/xdevapi, который официально поддерживается и поддерживается Oracle.

Чтобы установить новый пакет, запустите:

npm install @mysql/xdevapi --save --save-exact

Чтобы подключиться к базе данных и вставить некоторые значения:

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

mysqlx
    .getSession({
        user: 'root',
        password: '*****',
        host: 'localhost',
        port: 33060
    })
    .then(function (session) {

    // Accessing an existing table
    myTable = session.getSchema('Database_Name').getTable('Table_Name');

    // Insert SQL Table data
    return myTable
        .insert(['first_name', 'last_name'])
        .values(['John', 'Doe'])
        .execute()
    });

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


2

Если вы используете докер, он работает для меня!

в docker-compose.ymlдобавьте следующие строки:

mysql:
   ...    
   command: --default-authentication-plugin=mysql_native_password
   restart: always

после этого downконтейнер и upснова.


2

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

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

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

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

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

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


Ахмед, большое спасибо за ваши переформатированные изменения. Теперь легче читать.
— Чарльз Гудвин

1

В дополнение к ответам выше; После выполнения команды ниже

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

Если вы получаете ошибку как:

[ERROR] Column count of mysql.user is wrong. Expected 42, found 44. The table is probably corrupted

Затем попробуйте в cmd как администратор; установить путь к папке bin сервера MySQL в cmd

set path=%PATH%;D:\xampp\mysql\bin;

и затем выполните команду:

mysql_upgrade --force -uroot -p

Это должно обновить сервер и системные таблицы.

Тогда вы сможете успешно выполнить приведенные ниже команды в Запросе в Workbench:

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

затем не забудьте выполнить следующую команду:

flush privileges;

После всех этих шагов вы сможете успешно подключиться к базе данных MySQL. Надеюсь это поможет...



0

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

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


0

Просто понял это, попробовав множество вещей. То, что наконец-то сделало это для меня, было добавлением require('dotenv').config()в мой .sequelizercфайл. Очевидно, sequelize-cli не читает переменные env.


0

Вы можете пропустить ORM, сборщики и т. Д. И упростить управление БД / SQL с помощью sqlerи sqler-mdb.

-- create this file at: db/mdb/read.table.rows.sql
SELECT TST.ID AS "id", TST.NAME AS "name", NULL AS "report",
TST.CREATED_AT AS "created", TST.UPDATED_AT AS "updated"
FROM TEST TST
WHERE UPPER(TST.NAME) LIKE CONCAT(CONCAT('%', UPPER(:name)), '%') 
const conf = {
  "univ": {
    "db": {
      "mdb": {
        "host": "localhost",
        "username":"admin",
        "password": "mysqlpassword"
      }
    }
  },
  "db": {
    "dialects": {
      "mdb": "sqler-mdb"
    },
    "connections": [
      {
        "id": "mdb",
        "name": "mdb",
        "dir": "db/mdb",
        "service": "MySQL",
        "dialect": "mdb",
        "pool": {},
        "driverOptions": {
          "connection": {
            "multipleStatements": true
          }
        }
      }
    ]
  }
};

// create/initialize manager
const manager = new Manager(conf);
await manager.init();

// .sql file path is path to db function
const result = await manager.db.mdb.read.table.rows({
  binds: {
    name: 'Some Name'
  }
});

console.log('Result:', result);

// after we're done using the manager we should close it
process.on('SIGINT', async function sigintDB() {
  await manager.close();
  console.log('Manager has been closed');
});

0

Понижение рейтинга не может быть хорошим вариантом, так как:

  1. Его модернизировали по причине (чтобы обеспечить лучшую аутентификацию).
  2. Возможно, у вас недостаточно прав для внесения таких изменений.

Вы можете использовать mysql2пакет вместо mysql. В основном это API, совместимый с mysqljs. Также есть поддержка обещаний.

Используйте это как: const mysql = require('mysql2/promise')

Вы можете прочитать больше о mysql2здесь: https://www.npmjs.com/package/mysql2

Надеюсь, поможет. :)


-1

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

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

пожалуйста, не добавляйте проблему, с которой вы сталкиваетесь, как ответ на проблему, с которой вы столкнулись
— Aloy A Sen
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.