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

270

Ich kann aus irgendeinem Grund keine 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 gefunden:

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 nachgelesen, wie zum Beispiel: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507

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

Schwein
quelle
2
Alle VS Code-Benutzer, die die SQLTools-Erweiterung verwenden, sollten sich auf diesen Beitrag beziehen, falls sie Probleme damit haben, insbesondere wenn Sie gerade eine MySQL-Instanz auf Ihrem Entwicklungscomputer
aktualisiert haben

Antworten:

672

Führen Sie die folgende Abfrage in MYSQL Workbench aus

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

Wo rootals Ihr Benutzer localhostals Ihre URL und passwordals Ihr Passwort

Führen Sie dann diese Abfrage aus, um die Berechtigungen zu aktualisieren:

flush privileges;

Versuchen Sie anschließend, eine Verbindung über den Knoten herzustellen.

Wenn das nicht funktioniert, versuchen Sie es ohne @'localhost'Teil.

Pras
quelle
47
Das hat bei mir funktioniert. Vergiss nicht flush privileges;danach.
Ali Hesari
12
Es funktionierte für mich ohne den @localhost (ich denke, es könnte sein, weil es nicht für den Root-Benutzer war)
NicolasZ
10
Ersetzen Sie 'Passwort' durch Ihr Root-Passwort, wenn Sie es kennen
Vedha Peri
11
Es funktioniert ...... aber warum es vorher nicht funktioniert hat und warum es nach dieser Abfrage funktioniert hat, ist immer noch eine Frage.
Saksham
9
Hi @GuilhermeMatuella Dies liegt daran, dass caching_sha2_passwordes in MySQL 8.0 eingeführt wurde, aber die Node.js-Version noch nicht implementiert ist.
Daksh Gargas
104

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

MySQL 8 unterstützt steckbare Authentifizierungsmethoden. Standardmäßig wird einer von ihnen caching_sha2_passwordanstelle unseres guten alten mysql_native_password( Quelle ) verwendet. Es sollte offensichtlich sein, dass die Verwendung eines Krypto-Algorithmus mit mehreren Handshakes sicherer ist als die einfache Passwortübergabe, die es seit 24 Jahren gibt !

Das Problem liegt nun mysqljsin Node (das Paket, mit dem Sie es installieren npm i mysqlund in Ihrem Node-Code verwenden), unterstützt diese neue Standardauthentifizierungsmethode von MySQL 8 noch nicht. Das Problem ist hier zu finden: https://github.com/mysqljs/mysql/issues/1507 und ist nach 3 Jahren ab Juli 2019 noch offen.

(UPDATE Juni 2019: Es gibt jetzt eine neue PR in mysqljs , um dies zu beheben! ) (UPDATE Februar 2020: Anscheinend ist die Veröffentlichung in Version 3 von mysqljs geplant . )

Deine Optionen

Option 1) Downgrade von "MySQL" zur Authentifizierung mit dem guten alten "native_password"

Das schlagen hier alle vor (zB Top-Antwort oben ). Sie müssen nur mysqleine Abfrage starten und ausführen, die besagt, dass die rootVerwendung der alten native_passwordMethode zur automatischen Authentifizierung in Ordnung ist:

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 Probleme verwenden . Das Problem ist jedoch, dass Sie nicht die 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 das Mysqljs-Paket von Node , das von offiziellen Mitarbeitern von http://dev.mysql.com bereitgestellt wird .

Es funktioniert wie ein Zauber, der die caching_sha2_passwordAuthentifizierung unterstützt . ( Stellen Sie einfach sicher, dass Sie den Port 33060für die X-Protokoll-Kommunikation verwenden .)

Das Schlimme ist, dass Sie unser altes mysqlPaket verlassen haben, an das sich alle so gewöhnt haben.

Das Gute ist, Ihre App ist jetzt sicherer und Sie können eine Menge neuer Dinge nutzen, 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 hat, die nützlich sein können. Sie müssen nur den Preis für eine Lernkurve bezahlen, die voraussichtlich mit jedem Technologie-Upgrade einhergeht. :) :)

PS. Leider hat dieses XDevAPI-Paket noch keine Typdefinition (für TypeScript verständlich). Wenn Sie also Typoskript verwenden, treten Probleme auf. Ich habe versucht, .d.ts mit dts-genund zu generierendtsmake , aber keinen Erfolg. Denken Sie also daran.

Prost!

Hilfe bei der
quelle
3
Vielen Dank für die detaillierte Antwort auf eine einjährige Frage. :]
Daksh Gargas
3
schön, eine Antwort, die tatsächlich mysql_native_password erklärt, anstatt Ihnen nur zu sagen, dass Sie es tun sollen
wizloc
1
Ja, einmal eine richtige Erklärung. Gut auf dich, Aidin. Wie ich wünschte, Apps zu verbinden, hat Port 3306 nicht automatisch für MySQL konfiguriert. Wir haben genug Probleme, MySQL und MariaDB von 3306 weg zu preisen.
Trunk
Seien Sie vorsichtig mit Oracle-Plugins, Sie könnten eine große Strafe bekommen: theregister.co.uk/2019/10/04/oracle_virtualbox_merula
Juha Untinen
Dies ist eine ausgezeichnete Antwort, die mehr positive Stimmen verdient!
June Wenston
82

Verwendung der alten mysql_native_passwordWerke:

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_passwordes in MySQL 8.0 eingeführt wurde, die Node.js-Version jedoch noch nicht implementiert ist. Weitere Informationen finden Sie in dieser Pull-Anforderung und in diesem Problem . Wahrscheinlich wird bald ein Fix kommen!

upupming
quelle
Arbeite wie ein Zauber. Was für eine Erleichterung!
Hat
Was ist der Unterschied zwischen dem Hinzufügen von @localhost und nur 'root'
filemonczyk
Abfrage funktioniert. Der Knoten konnte jedoch keine Verbindung zum MySQL-Server herstellen. Irgendeine Idee? Hier ist der Fehler {"code": "ER_ACCESS_DENIED_ERROR", "errno": 1045, "sqlMessage": "Zugriff für Benutzer 'root' @ 'localhost' verweigert (mit Passwort: YES)", "sqlState": "28000" , "fatal": true}
Sanjay Pradeep
26

Vollständige Schritte für MySQL 8

Stellen Sie eine Verbindung zu MySQL her

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

Setze dein Passwort zurück

(Ersetzen Sie your_new_passworddurch das Passwort, das Sie verwenden möchten)

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

Versuchen Sie dann, eine Verbindung über den Knoten herzustellen

Joshuakcockrell
quelle
@sky siehe meine Antwort oben für die Details.
Aidin
1
@Aidin Danke, es ist sehr hilfreich.
Sky
17

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 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';
Siddhant
quelle
2
Wenn jemand diesen Weg gehen möchte, ist hier ein Artikel mit einigen Erklärungen: digitalocean.com/community/tutorials/…
Devin
12

Wenn Sie auf diesen Fehler gestoßen sind, aber dennoch MySQLVersion 8 verwenden möchten, können Sie dies erreichen, indem Sie MySQL Server anweisen, das Legacy-Authentifizierungs-Plugin zu verwenden, wenn Sie die Datenbank mit erstellen Docker.

Ihre composeDatei sieht also folgendermaßen 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
Reich
quelle
Ich verwende dies command, mysql
erhalte
Der vollständige Stacktrace ist hier: pastebin.com/SzayQzdh und die Docker-compose.yml : pastebin.com/7pUrWYDs Der Fehler selbst ist:Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
Juha Untinen
1
@JuhaUntinen Stellen Sie sicher, dass Sie einen Docker-Container (den von Docker-Compose erstellten) und ein Volume (~ / Database / ORM_Test) entfernt haben, und führen Sie dann 'Docker-Compose up' erneut aus. Andernfalls werden die Änderungen von 'Befehl' nicht übernommen. Es hat in meinem Fall geholfen.
Vitalii Ivanov
11

In MySQL Neuester Docker-Container

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';
MacielJr
quelle
9

Wenn die Befehlszeile ALTER USER ... für Sie 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 die MySQL Windows Installer - Community

3) Suchen Sie nach "MySQL Server" und klicken Sie auf Reconfigure Schritt 3

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

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

6) Befolgen Sie dann die vom Windows-Installationsprogramm angegebenen Schritte bis zum Ende

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

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

Campalo
quelle
4

In MySQL 8.0 caching_sha2_passwordist das Standard-Authentifizierungs-Plugin eher alsmysql_native_password. ...

Die meisten Antworten in dieser Frage führen zu einem Downgrade des Authentifizierungsmechanismus von caching_sha2_passwordauf mysql_native_password. Aus sicherheitstechnischer Sicht ist dies ziemlich enttäuschend.

In diesem Dokument wird ausführlich erläutert, caching_sha2_passwordwarum es NICHT die erste Wahl sein sollte, die Authentifizierungsmethode herunterzustufen.

Damit glaube ich, dass Aidins Antwort die akzeptierte Antwort sein sollte. Verwenden Sie statt eines Downgrades der Authentifizierungsmethode einen Connector, der der Serverversion entspricht.

Lester
quelle
3

Die 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);
  });
Shivang Patel
quelle
Es sieht komplizierter aus, aber ich denke, wir sollten dem offiziellen Leitfaden folgen! b
Juneyoung Oh
3

Ich habe MYSQL auf dem Server und NodeJS-Anwendung auf einem anderen Server

Führen Sie die folgende Abfrage in MYSQL Workbench aus

ALTER USER 'root' @ '%' IDENTIFIZIERT MIT mysql_native_password BY 'password'

iomar
quelle
2

Für vorhandene MySQL 8.0-Installationen unter Windows 10 MySQL,

(1) Installer starten,

(2) Klicken Sie dann unter QuickAction (links von MySQL Server) auf "Neu konfigurieren"

(3) Klicken Sie auf Weiter, um bis zur Ankunft durch die nächsten 2 Bildschirme zu blättern

(4) Wählen Sie unter "Authentifizierungsmethode" die Option "Legacy-Authentifizierungsmethode verwenden (MySQL 5.x-Kompatibilität beibehalten").

(5) Klicken Sie weiter, bis die Installation abgeschlossen ist

Charles Goodwin
quelle
2

Bei MySQL 8+ ist die neue Standardauthentifizierung caching_sha2_passwordanstelle von mysql_native_password. Die neue und sicherere Authentifizierungsmethode wird vom nativen mysqlPaket noch nicht unterstützt. Sie sollten jedoch in Betracht ziehen, stattdessen das Paket zu @mysql/xdevapiverwenden, das von Oracle offiziell unterstützt und verwaltet wird.

Führen Sie Folgendes aus, um das neue Paket zu installieren:

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

So stellen Sie eine Verbindung zur Datenbank her und fügen einige Werte ein:

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()
    });

Die offizielle Paketdokumentation finden Sie hier: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/

Elder Druide
quelle
2

Wenn Sie Docker verwenden, hat es bei mir funktioniert!

in der docker-compose.ymldie folgenden Zeilen:

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

danach downder Container und upwieder.

Löwe
quelle
1

Zusätzlich zu den obigen Antworten; Nach dem Ausführen des folgenden Befehls

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

Wenn Sie eine Fehlermeldung erhalten als:

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

Versuchen Sie es dann im cmd als admin; Legen Sie den Pfad zum Ordner "MySQL Server bin" im cmd fest

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

Führen Sie dann den folgenden Befehl aus:

mysql_upgrade --force -uroot -p

Dies sollte den Server und die Systemtabellen aktualisieren.

Dann sollten Sie in der Lage sein, die folgenden Befehle in einer Abfrage in der Workbench erfolgreich auszuführen:

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

Denken Sie dann daran, den folgenden Befehl auszuführen:

flush privileges;

Nach all diesen Schritten sollte es möglich sein, eine Verbindung zu Ihrer MySQL-Datenbank herzustellen. Hoffe das hilft...

Madhawa Jayagoda
quelle
0

Führen Sie einfach MySQL Server Installer aus und konfigurieren Sie My SQL Server neu ... Dies hat bei mir funktioniert.

Alexander Burias
quelle
0

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

Zum Abfangen von Fehlern ist es immer nützlich, eine überschriebene _delegateErrorMethode 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 zu verfolgen.

B. Bohdan
quelle
0

Ich habe das gerade herausgefunden, nachdem ich zahlreiche Dinge ausprobiert hatte. Was es schließlich für mich getan hat, war das Hinzufügen require('dotenv').config()zu meiner .sequelizercDatei. Anscheinend liest sequelize-cli keine env-Variablen.

gbland777
quelle
0

Down Grading ist möglicherweise keine gute Option, da:

  1. Es wurde aus einem bestimmten Grund aktualisiert (um eine bessere Authentifizierung zu gewährleisten).
  2. Möglicherweise verfügen Sie nicht über genügend Berechtigungen, um solche Änderungen vorzunehmen.

Sie können das mysql2Paket anstelle von verwenden mysql. Es ist größtenteils API-kompatibel mit mysqljs. Auch verspricht es Unterstützung.

Verwenden Sie es wie: const mysql = require('mysql2/promise')

Weitere Informationen finden Sie mysql2hier: https://www.npmjs.com/package/mysql2

Ich hoffe es hilft. :) :)

Salim Shamim
quelle
0

Sie können ORM, Builder usw. überspringen und Ihre DB / SQL-Verwaltung mit sqlerund vereinfachen 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');
});
hässlich
quelle
-1

Ich habe das gleiche Problem mit MySQL und löse es, indem ich XAMPP verwende, um eine Verbindung mit MySQL herzustellen und die Dienste in Windows für MySQL (Systemsteuerung - Verwaltung - Dienste) und im Ordner db.js (der für die Datenbank verantwortlich ist) I zu stoppen mach das Passwort leer (hier siehst du :)

const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: ''
});
Mohammad Jouza
quelle
Bitte fügen Sie kein Problem hinzu, mit dem Sie als Antwort auf das Problem konfrontiert sind
Aloy A Sen