716 votes

MySQL 8.0 - Le client ne prend pas en charge le protocole d'authentification demandé par le serveur; envisager de mettre à niveau le client MySQL

Je suis un node.js et MySQL débutant et je viens de commencé à mettre en place et d'expérimenter certaines de code de base. Cependant, je ne peux pas faire une simple connexion au serveur pour une raison quelconque. J'ai installer la dernière version de MySQL Communauté 8.0 base de données avec Node.JS avec les paramètres par défaut.

C'est mon 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!");
    });

Ci-dessous est l'erreur trouvée dans l'Invite de Commande:

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)

J'ai lu sur des choses telles que: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507

Mais je ne suis toujours pas sûr de savoir comment régler mon problème. Toute aide serait appréciée :D

1772voto

Pras Points 4600

Exécutez la requête suivante dans MYSQL Workbench

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

root comme utilisateur localhost comme URL et password comme mot de passe

Essayez de vous connecter à l'aide d'un nœud après l'avoir fait

669voto

Aidin Points 1068

Nous allons tout d'abord faire comprendre ce qui se passe.

MySQL 8 a prend en charge l'authentification enfichable méthodes. Par défaut, l'un d'eux, nommé caching_sha2_password est utilisé plutôt que notre bon vieux mysql_native_password (source). Il devrait être évident que l'utilisation d'un algorithme de chiffrement avec plusieurs poignées de main est plus sûr que le mot de passe en clair en passant qui existe depuis 24 ans!

Maintenant, le problème est - mysqljs dans le Nœud (le package que vous installez avec npm i mysql et à utiliser dans votre Nœud de code) ne prend pas en charge cette nouvelle méthode d'authentification par défaut de MySQL 8, encore. La question est ici: https://github.com/mysqljs/mysql/issues/1507 et est toujours ouverte, au bout de 3 ans, à compter de juillet 2019. (Mise à JOUR juin 2019: Il y a un nouveau PR dans mysqljs maintenant pour corriger cet!)

Vos options

Option 1) Décote "MySQL" pour authentifier à l'aide de ce bon vieux "native_password"

C'est ce que tout le monde suggère ici (par exemple, haut la réponse ci-dessus). Vous venez d'obtenir en mysql et exécutez une requête en disant: root est fine à l'aide de vieux - native_password méthode pour authnetication:

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

La bonne chose est, la vie est simple et vous pouvez toujours utiliser le bon vieux outils comme Sequel Pro sans aucun problème. Mais le problème est, vous ne prenez pas avantage d'une plus sécurisé (et cool, lire ci-dessous) fourre disponible pour vous.

Option 2) Remplacer "Nœud" package avec MySQL Connecteur X DevAPI

MySQL X DevAPI pour le Nœud est un remplacement du Nœud Mysqljs paquet, fourni par http://dev.mysql.com officiel les gars.

Il fonctionne comme un charme soutenant caching_sha2_password d'authentification. (Assurez-vous d'utiliser le port 33060 pour X Protocole de communication.)

La mauvaise chose est, vous avez quitté notre ancien mysql package que tout le monde est tellement habitué, et s'appuie sur.

La bonne chose est, votre application est plus en sécurité maintenant et vous pouvez profiter d'une tonne de nouvelles choses que nos bons vieux amis n'ont pas de fournir! Il suffit de consulter le tutoriel de X DevAPI et vous verrez qu'il a une tonne de sexy de nouvelles fonctionnalités qui peuvent venir dans maniable. Vous avez juste besoin de payer le prix d'une courbe d'apprentissage, ce qui évidemment est livré avec toute la technologie mise à niveau. :)

PS. Malheureusement, cette XDevAPI Paquet n'a pas de types de définition (compréhensible par la Machine), de sorte que si vous êtes sur la machine, vous aurez des problèmes. J'ai essayé de générer .d.ts à l'aide de dts-gen et dtsmake, mais sans succès. Donc, gardez cela à l'esprit.

Cheers!

113voto

upupming Points 454

L'utilisation de l'ancien mysql_native_password fonctionne:

 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;
 

En effet, caching_sha2_password est introduit dans MySQL 8.0, mais la version Node.js n'est pas encore implémentée. Vous pouvez voir cette demande d'extraction et ce problème pour plus d'informations. Une solution viendra probablement bientôt!

50voto

joshuakcockrell Points 964

Étapes complètes pour MySQL 8

Connectez-vous à MySQL

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

réinitialisez votre mot de passe

(Remplacez your_new_password par le mot de passe que vous souhaitez utiliser)

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

Essayez ensuite de vous connecter à l'aide d'un nœud

25voto

Siddhant Points 64

Bien que la réponse acceptée soit correcte, je préfère créer un nouvel utilisateur, puis utiliser cet utilisateur pour accéder à la base de données.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X