Maison  >  Questions et réponses  >  le corps du texte

Veuillez mettre à jour le client MySQL : MySQL 8.0 - Le client ne prend pas en charge le protocole d'authentification demandé par le serveur

Pour une raison quelconque, je ne parviens pas à établir une simple connexion au serveur. J'ai installé la dernière base de données MySQL Community 8.0 avec Node.JS en utilisant les paramètres par défaut.

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

Voici les erreurs trouvées dans l'invite de commande :

C:Usersmysql-test>node app.js
    C:Usersmysql-testnode_modulesmysqllibprotocolParse
    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:Usersmysql-
testnode_modulesmysqllibprotocolsequencesSequence.js:52:14)
    at Handshake.ErrorPacket (C:Usersmysql-testnode_mo
dulesmysqllibprotocolsequencesHandshake.js:130:18)
    at Protocol._parsePacket (C:Usersmysql-testnode_mo
dulesmysqllibprotocolProtocol.js:279:23)
    at Parser.write (C:Usersmysql-testnode_modulesmys
qllibprotocolParser.js:76:12)
    at Protocol.write (C:Usersmysql-testnode_modulesm
ysqllibprotocolProtocol.js:39:16)
    at Socket.<anonymous> (C:Usersmysql-testnode_modul
esmysqllibConnection.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:Usersmysql-testnode_module
smysqllibprotocolProtocol.js:145:48)
    at Protocol.handshake (C:Usersmysql-testnode_modul
esmysqllibprotocolProtocol.js:52:23)
    at Connection.connect (C:Usersmysql-testnode_modul
esmysqllibConnection.js:130:18)
    at Object.<anonymous> (C:Usersmysql-testserver.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 quelque chose comme : https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507

Mais je ne sais toujours pas comment résoudre mon problème.

P粉574695215P粉574695215375 Il y a quelques jours729

répondre à tous(2)je répondrai

  • P粉161939752

    P粉1619397522023-10-11 09:08:13

    Résumé

    1. Si vous souhaitez simplement éliminer les bugs, au détriment des risques de sécurité du projet (par exemple, il s'agit simplement d'un projet personnel ou d'un environnement de développement), utilisez la réponse de @Pras -- ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password' 然后 刷新权限
    2. Si vous souhaitez le réparer et ne savez pas pourquoi, installez et utilisez simplement mysql2 (而不是 mysql)并使用它 - npm我 mysql2mysql = require('mysql2');.
    3. Si vous êtes un développeur curieux et toujours désireux d'apprendre, lisez la suite... :)

    Que s'est-il passé ?

    Nous devons d’abord comprendre ce qui s’est passé.

    MySQL 8 prend en charge les méthodes d'authentification enfichables. Par défaut, l'un d'eux nommé caching_sha2_password 的密码,而不是我们的旧 mysql_native_password (source) est utilisé. Apparemment, l'algorithme de cryptage utilisant plusieurs poignées de main est plus sécurisé que la transmission normale de mot de passe utilisée dans 24. Année !

    Maintenant, le problème est que les packages dans Node mysqljs (使用 npm i mysql qui l'installent et l'utilisent dans le code Node) ne prennent pas encore en charge cette nouvelle méthode d'authentification par défaut pour MySQL 8. Le problème est ici : https://github.com/mysqljs/mysql/issues/1507 En juillet 2019, toujours ouvert trois ans plus tard.

    Mise à jour de juin 2019 : Il y a un nouveau PR dans mysqljs pour résoudre ce problème maintenant !

    Mise à jour de février 2020 : Apparemment, il est prévu pour arriver dans la version 3 de mysqljs.

    Mise à jour de juillet 2020 : Apparemment, ce n'est pas encore (au moins en avril 2020) , mais affirme que < a href="https://github.com/sidorares/node-mysql2" rel="noreferrer">node-mysql2 prend en charge les demandes de changement d'authentification. Si node-mysql2 fonctionne pour vous, veuillez laisser un commentaire ci-dessous – je le testerai moi-même plus tard.

    Mise à jour d'avril 2021 : Le problème semble toujours exister, il y a à peine 3 jours, quelqu'un a créé un fork et l'a implémenté - mais pas encore officiellement dans le package mysql.js. De plus, d'après les commentaires ci-dessous, il semble que le paquet mysql2 fonctionne correctement et prend correctement en charge le changement d'authentification.


    Vos options actuelles

    Option 1) [Non recommandé] Rétrogradez "MySQL" pour utiliser l'ancien "mysql_native_password" pour l'authentification

    C'est ce que tout le monde suggère ici (comme la meilleure réponse ci-dessus). Il vous suffit de saisir la méthode mysql 并运行一个查询,说明 root 可以使用旧的 mysql_native_password pour vous authentifier :

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

    La bonne nouvelle est que la vie devient plus facile et que vous pouvez toujours utiliser de bons vieux outils comme Sequel Pro sans aucune question. Mais le problème est que vous ne profitez pas de quelque chose de plus sûr (et de plus cool, lisez ci-dessous).

    Option 2) [Meh...] Remplacez le package "Node" par MySQL Connecter X DevAPI

    MySQL Il fonctionne comme un support pour la communication selon le protocole X. )

    Dommage que vous vous soyez éloigné de l'ancien forfait caching_sha2_password 身份验证的超级按钮。 (只需确保您使用端口 33060 auquel chacun d'entre nous était habitué et sur lequel il comptait. Le bonus, c'est que vos applications sont désormais plus sécurisées et que vous pouvez profiter de tonnes de nouvelles fonctionnalités que notre bon vieil ami n'offre pas ! Consultez simplement le

    X DevAPI Tutorial

    et vous découvrirez qu'il contient des tonnes de nouvelles fonctionnalités sexy qui peuvent vous être utiles. Il vous suffit de payer le prix de la courbe d’apprentissage, qui accompagne toute mise à niveau technologique. :)mysql PS. Malheureusement, ce package XDevAPI n'a pas encore de définitions de type (que TypeScript comprend), donc si vous utilisez

    typescript

    , vous aurez des problèmes. J'ai essayé d'utiliser dts-gen et dtsmake pour générer le .d.ts sans succès. Alors s’il vous plaît, gardez cela à l’esprit.

    Option 3) [Recommandé] Remplacez "mysql.js" par le package "mysql2.js"

    Comme mentionné ci-dessus, le package mysql (lien du package NPM) a toujours ce problème (en avril 2021). Mais le package mysql2 (lien du package NPM) ne l'est pas. Donc ce qui suit devrait probablement être la réponse facile !

    npm un mysql && npm i mysql2
    

    Remarque, mysql2 是流行的 mysql 的一个分支,但它的受欢迎程度(4 月份 mysql2 每周下载量为 62 万次) 2020 年)已接近原始软件包(2021 年 4 月 mysql 720K téléchargements par semaine), il semble donc raisonnable de faire le changement !

    répondre
    0
  • P粉198749929

    P粉1987499292023-10-11 00:55:10

    Exécutez la requête suivante dans MYSQL Workbench

    更改用户 'root'@'localhost' 通过 mysql_native_password BY 'password' 进行识别;

    root se trouve votre utilisateur localhost comme URL et password comme mot de passe

    Ensuite, exécutez cette requête pour actualiser les autorisations :

    刷新权限;

    Après cela, essayez de vous connecter à l'aide d'un nœud.

    Si cela ne fonctionne pas, essayez sans la partie @'localhost'.

    répondre
    0
  • Annulerrépondre