wake-up-neo.com

MySQL 8.0 - Der Client unterstützt kein vom Server angefordertes Authentifizierungsprotokoll. Erwägen Sie ein Upgrade des MySQL-Clients

Ich bin ein node.js und MySQL-Anfänger und habe gerade angefangen, ein paar grundlegende Codes einzurichten und auszuprobieren. Ich kann jedoch aus irgendeinem Grund nicht einmal eine einfache Verbindung zum Server herstellen. Ich installiere die neueste MySQL Community 8.0-Datenbank zusammen mit Node.JS mit Standardeinstellungen.

Dies ist mein node.js Code

    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!");
    });

Unten ist der Fehler in der Eingabeaufforderung:

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)

Ich habe einige Dinge gelesen wie: https://dev.mysql.com/doc/refman/5.5/de/old-client.htmlhttps: // github.com/mysqljs/mysql/issues/1507

Ich bin mir immer noch nicht sicher, wie ich mein Problem beheben kann. Jede Hilfe wäre dankbar: D

59
Pig

Führen Sie die folgende Abfrage in MYSQL Workbench aus

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

Versuchen Sie, eine Verbindung mit dem Knoten herzustellen, nachdem Sie dies getan haben

187
Pras

Verwenden der alten mysql_native_password-Werke:

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;

Dies liegt daran, dass caching_sha2_password in MySQL 8.0 eingeführt wurde, die Version Node.js jedoch noch nicht implementiert ist. Diese Pull-Anfrage und Dieses Problem für weitere Informationen. Wahrscheinlich wird es bald eine Lösung geben!

27
upupming

Lassen Sie uns zunächst klarstellen, was los ist.

MySQL 8 unterstützt steckbare Authentifizierungsmethoden. Standardmäßig wird einer von ihnen mit dem Namen caching_sha2_password verwendet und nicht unser guter alter mysql_native_password ( source ). Es sollte offensichtlich sein, dass die Verwendung eines Krypto-Algorithmus mit mehreren Handshakes sicherer ist als die einfache Übergabe von Passwörtern, die es seit 24 Jahren gibt !

Das Problem ist nun mysqljs in Node (das Paket, das Sie mit npm i mysql installieren und in Ihrem Node Code verwenden), unterstützt diesen neuen Standard nicht Authentifizierungsmethode von MySQL 8 noch. Die Ausgabe befindet sich hier: https://github.com/mysqljs/mysql/issues/1507 und ist nach 3 Jahren ab Juli 2019 noch offen. (UPDATE Juni 2019: Es gibt eine neue PR in mysqljs , um dies zu beheben!)

Deine Optionen

Option 1) Führen Sie ein Downgrade von "MySQL" durch, um sich mit dem guten alten "native_password" zu authentifizieren.

Das schlagen alle hier vor (z. B. Antwort oben ). Sie müssen nur mysql aufrufen und eine Abfrage ausführen, in der angegeben wird, dass root für die Authentifizierung die alte Methode native_password verwendet:

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

Das Gute ist, das Leben wird einfach und Sie können immer noch gute alte Tools wie Sequel Pro ohne irgendein Problem verwenden. Das Problem ist jedoch, dass Sie keine sichereren (und cooleren, siehe unten) Dinge nutzen, die Ihnen zur Verfügung stehen.

Option 2) Ersetzen Sie das "Node" -Paket durch MySQL Connecter X DevAPI

MySQL X DevAPI für Node ist ein Ersatz für Nodes Mysqljs-Paket , bereitgestellt von http: // dev.mysql.com offizielle Jungs.

Es funktioniert wie ein Zauber, der die caching_sha2_password -Authentifizierung unterstützt. (Stellen Sie einfach sicher, dass Sie Port 33060 für X-Protokollkommunikation verwenden.)

Das Schlimme ist, dass Sie unser altes mysql -Paket verlassen haben, an das jeder so gewöhnt ist und auf das sich jeder verlässt.

Das Gute ist, dass Ihre App jetzt sicherer ist und Sie eine Menge neuer Dinge nutzen können, die unsere guten alten Freunde nicht zur Verfügung gestellt haben! Schauen Sie sich einfach das Tutorial von X DevAPI an und Sie werden sehen, dass es eine Menge neuer sexy Funktionen enthält, die sich als nützlich erweisen können. Sie müssen nur den Preis für eine Lernkurve bezahlen, die mit jedem Technologie-Upgrade einhergeht. :)

PS. Leider hat dieses XDevAPI-Paket noch keine Typendefinition (verständlich für TypeScript). Wenn Sie also auf TypeScript ​​sind, werden Sie Probleme haben. Ich habe versucht, .d.ts mit dts-gen und dtsmake zu generieren, aber kein Erfolg. Denken Sie also daran.

Prost!

16
Aidin

Obwohl die akzeptierte Antwort korrekt ist, würde ich es vorziehen, einen neuen Benutzer zu erstellen und diesen Benutzer dann für den Zugriff auf die Datenbank zu verwenden.

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

Wenn dieser Fehler auftritt, Sie jedoch weiterhin MySQL Version 8 verwenden möchten, können Sie dies tun, indem Sie MySQL Server anweisen, das Legacy-Authentifizierungs-Plugin zu verwenden, wenn Sie die Datenbank mit Docker erstellen.

Ihre Compose-Datei sieht also so aus:

# 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
2
Rich

Wenn die Befehlszeile ALTER USER ... bei Ihnen nicht funktioniert UND Sie Windows 10 verwenden, versuchen Sie, die folgenden Schritte auszuführen:

1) Geben Sie MySQL in die Windows-Suchleiste ein

2) Öffnen Sie den MySQL Windows Installer - Community

3) Suchen Sie nach "MySQL Server" und klicken Sie auf Neu konfigurieren step 3

4) Klicken Sie auf "Weiter", bis Sie die Phase "Authentifizierungsmethode" erreicht haben

5) Aktivieren Sie in der Phase "Authentifizierungsmethode" die zweite Option "Legacy-Authentifizierungsmethode verwenden" step 5

6) Folgen Sie dann den Anweisungen des Windows-Installationsprogramms bis zum Ende

7) Wenn Sie fertig sind, gehen Sie in der Windows-Suchleiste zu "Dienste" und klicken Sie auf "Start" MySql81 ".

Versuchen Sie es jetzt noch einmal, die Verbindung zwischen MySQL und Node.js sollte funktionieren!

2
Campalo

In Mysql Letzter Docker-Container 

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';
2
MacielJr

Originaldokumentation finden Sie hier: 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);
  });
1
shivang patel

Ich habe MYSQL auf einem Server und einer nodejs-Anwendung auf einem anderen Server 

Führen Sie die folgende Abfrage in MYSQL Workbench aus

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

1
iomar

Führen Sie einfach den MySQL Server Installer aus und konfigurieren Sie den My SQL Server neu ... Das hat für mich funktioniert.

0

Für bestehende Installationen von mysql 8.0 unter Windows 10 mysql (1) Starten Sie das Installationsprogramm (2) Klicken Sie unter QuickAction auf "recongifure" (links von MySQL Server) 1 und dann (3) Wählen Sie als nächstes durch die nächsten 2 Bildschirme bis zum Eintreffen von (4) unter "Authentifizierungsmethode". Wählen Sie "Legacy-Authentifizierungsmethode verwenden (Kompatibilität mit MySQL 5.x beibehalten)" 2 (5)

0
Charles Goodwin

Überprüfen Sie die Berechtigungen und den Benutzernamen/das Kennwort für Ihren MySQL-Benutzer.

Zum Abfangen von Fehlern ist es immer nützlich, die überschriebene _delegateError -Methode zu verwenden. In Ihrem Fall muss dies so aussehen:

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!");
});

Diese Konstruktion hilft Ihnen, schwerwiegende Fehler aufzuspüren.

0
B. Bohdan

Ich habe das gleiche Problem mit MySQL und löse es, indem ich mit XAMPP eine Verbindung mit MySQL herstelle und die Dienste in Windows für MySQL (Systemsteuerung - Verwaltung - Dienste) und im Ordner db.js (für die Datenbank verantwortliche) stoppe mach das Passwort leer (hier kannst du sehen :)

const mysql = require('mysql');
const connection = mysql.createConnection({
  Host: 'localhost',
  user: 'root',
  password: ''
});
0
Mohammad Jozaa

Für MySQL 8

Stellen Sie eine Verbindung zu MySQL her und setzen Sie Ihr Kennwort mit den folgenden Anweisungen zurück

$ mysql -u root -p
Enter password: (enter your root password)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
mysql> FLUSH PRIVILEGES;
mysql> quit

Versuchen Sie dann, die Verbindung über den Knoten herzustellen

0
joshuakcockrell