web-dev-qa-db-fra.com

MySQL 8.0 - Le client ne supporte pas le protocole d'authentification demandé par le serveur; envisager de mettre à jour le client MySQL

Je suis un débutant de node.js et MySQL et je viens de commencer à configurer et à essayer du code de base. Cependant, je ne peux même pas établir une simple connexion au serveur pour une raison quelconque. J'installe la dernière base de données MySQL Community 8.0 avec Node.JS avec les paramètres par défaut.

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

Ci-dessous 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 certaines choses telles que: https://dev.mysql.com/doc/refman/5.5/fr/old-client.htmlhttps://github.com/mysqljs/ mysql/issues/1507

Mais je ne sais toujours pas comment régler mon problème. Toute aide serait appréciée: D

59
Pig

Exécuter la requête suivante dans MYSQL Workbench

ALTER USER 'root' @ 'localhost' IDENTIFIÉ AVEC mysql_native_password BY 'password'

Essayez de vous connecter en utilisant noeud après cela.

187
Pras

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

Ceci est dû au fait que caching_sha2_password est introduit dans MySQL 8.0, mais que la version de Node.js n’est pas encore implémentée. Vous pouvez voir cette demande d'extraction et ce problème pour plus d'informations. Probablement un correctif viendra bientôt!

27
upupming

Commençons par clarifier ce qui se passe.

MySQL 8 supporte les méthodes d'authentification enfichables. Par défaut, l'un d'entre 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 handshakes est plus sûre que le mot de passe en clair qui existe depuis 24 ans !

Maintenant, le problème est mysqljs dans Node (le paquet que vous installez avec npm i mysql et que vous l'utilisez dans votre code Node] ne supporte pas ce nouveau paramètre par défaut. méthode d'authentification de MySQL 8, pour le moment. Le problème se trouve ici: https://github.com/mysqljs/mysql/issues/1507 et est toujours ouvert après 3 ans à compter de juillet 2019. (MISE À JOUR Juin 2019: Il y a un nouveau PR dans mysqljs maintenant pour résoudre ce problème!)

Vos options

Option 1) Rétrograder "MySQL" pour s'authentifier à l'aide du bon vieux "mot_passe_individuel"

C'est ce que tout le monde suggère ici (par exemple: réponse en haut ci-dessus ). Vous venez juste d'entrer dans mysql et d'exécuter une requête disant que root est correct en utilisant l'ancienne méthode native_password pour l'auto-identification:

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

La bonne chose est que la vie sera simple et que vous pourrez toujours utiliser de bons vieux outils comme Sequel Pro sans aucun problème . Mais le problème, c’est que vous ne tirez pas parti d’une offre plus sûre (et plus cool, à lire ci-dessous).

Option 2) Remplacez le package "Node" par MySQL Connecter X DevAPI

MySQL X DevAPI pour Node remplace le paquet Mysqljs du nœud , fourni par http://dev.mysql.com mecs officiels.

Cela fonctionne comme un charme supportant caching_sha2_password authentification. (Assurez-vous simplement que vous utilisez le port 33060 pour communications avec le protocole X .)

Le problème, c’est que vous avez quitté notre ancien paquetage mysql auquel tout le monde est habitué et sur lequel on compte.

Le bon côté des choses, c’est que votre application est plus sécurisée maintenant et que vous pouvez profiter d’une tonne de nouveautés que nos bons vieux amis n’ont pas fournies! Il suffit de consulter le tutoriel de X DevAPI et vous verrez qu'il contient une tonne de nouvelles fonctionnalités sexy qui peuvent vous être utiles. Vous avez juste besoin de payer le prix d’une courbe d’apprentissage, qui devrait venir avec toute mise à niveau technologique. :)

PS Malheureusement, ce paquet XDevAPI n'a pas encore de types définition (compréhensible par TypeScript), donc si vous êtes sur TypeScript , vous aurez des problèmes. J'ai essayé de générer des fichiers .d.ts en utilisant dts-gen et dtsmake, mais sans succès. Alors garde cela en tête.

À votre santé!

16
Aidin

Bien que la réponse acceptée soit correcte, je préfère créer un nouvel utilisateur, puis l’utiliser 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';
3
Siddhant

Si vous rencontrez cette erreur mais souhaitez tout de même utiliser MySQL version 8. Pour ce faire, vous pouvez indiquer à MySQL Server d’utiliser le plug-in d’authentification hérité lorsque vous créez la base de données à l'aide de Docker.

Donc, votre fichier de composition ressemblera à ceci:

# 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

Si la ligne de commande ALTER USER ... ne fonctionne pas pour vous ET si vous utilisez Windows 10, essayez de suivre les étapes suivantes:

1) Tapez MySQL dans la barre de recherche de Windows

2) Ouvrez MySQL Windows Installer - Communauté

3) Recherchez "serveur MySQL" et cliquez sur Reconfigurer step 3

4) Cliquez sur "Suivant" jusqu'à la phase "Méthode d'authentification".

5) Dans la phase "Méthode d’authentification", cochez la deuxième option "Utiliser la méthode d’authentification classique" step 5

6) Suivez ensuite les étapes données par le programme d’installation Windows jusqu’à la fin.

7) Une fois terminé, allez dans "Services" dans la barre de recherche Windows, cliquez sur "démarrer" MySql81 ".

Maintenant, essayez encore, la connexion entre MySQL et Node.js devrait fonctionner!

2
Campalo

Dans Mysql Dernier conteneur de docker 

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

Vous trouverez la documentation originale ici: 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

J'ai MYSQL sur le serveur et l'application nodejs sur un autre serveur 

Exécuter la requête suivante dans MYSQL Workbench

ALTER USER 'root' @ '%' IDENTIFIÉ AVEC mysql_native_password BY 'password'

1
iomar

Il suffit d’exécuter le programme d’installation du serveur MySQL et de reconfigurer My SQL Server ... Cela a fonctionné pour moi.

0
Alexander Burias

Pour les installations existantes de mysql 8.0 sur Windows 10 mysql, (1) lancez le programme d'installation, cliquez sur "Recongifure" sous QuickAction (à gauche de MySQL Server) 1 , puis sur (3). Cliquez sur Suivant pour passer à travers les 2 écrans suivants jusqu'à arriver (4) sous "Méthode d'authentification", sélectionnez "Utiliser la méthode d'authentification héritée (conserver la compatibilité MySQL 5.x") 2 (5) Cliquez jusqu'à ce que l'installation soit terminée

0
Charles Goodwin

Vérifiez les privilèges et le nom d'utilisateur/mot de passe de votre utilisateur MySQL.

Pour détecter les erreurs, il est toujours utile d'utiliser la méthode _delegateError surchargée. Dans votre cas, cela doit ressembler à:

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

Cette construction vous aidera à localiser les erreurs fatales.

0
B. Bohdan

J'ai le même problème avec MySQL et je résous en utilisant XAMPP pour me connecter à MySQL et arrêter les services dans Windows pour MySQL (panneau de configuration - Outils d'administration - Services) et dans le dossier db.js (responsable de la base de données) I Rendez le mot de passe vide (ici vous pouvez voir :)

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

Pour MySQL 8

Connectez-vous à MySQL et réinitialisez votre mot de passe en utilisant les éléments suivants

$ 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

Ensuite, essayez de vous connecter en utilisant noeud

0
joshuakcockrell