MySQL 8.0: el cliente no admite el protocolo de autenticación solicitado por el servidor; Considere actualizar el cliente MySQL




node.js (10)

Soy un principiante en node.js y MySQL y acabo de comenzar a configurar y probar algunos códigos básicos. Sin embargo, no puedo establecer una conexión simple con el servidor por alguna razón. Instalo la nueva base de datos MySQL Community 8.0 junto con Node.JS con la configuración predeterminada.

Este es mi código 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!");
    });

A continuación se muestra el error encontrado en el símbolo del sistema:

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)

He leído algunas cosas como: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507

Pero todavía no estoy seguro de cómo solucionar mi problema. Cualquier ayuda sería apreciada: D


Pasos completos para MySQL 8

Conectarse a MySQL

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

Restablecer su contraseña

(Reemplace your_new_password con la contraseña que desea usar)

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

A continuación, intente conectar utilizando el nodo



En Mysql Latest Dockper Container

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';

La documentación original se puede encontrar aquí: 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);
  });

Primero dejemos claro lo que está pasando.

MySQL 8 tiene soporte para métodos de autenticación conectables. De forma predeterminada, se usa uno de ellos llamado caching_sha2_password lugar de nuestro antiguo mysql_native_password ( source ). ¡Debería ser obvio que el uso de un algoritmo de cifrado con varios handshakes es más seguro que el paso de contraseña simple que ha estado allí durante 24 años !

Ahora, el problema es mysqljs en Node (el paquete que instala con npm i mysql y lo usa en su código de Node) todavía no es compatible con este nuevo método de autenticación predeterminado de MySQL 8. El problema se encuentra aquí: https://github.com/mysqljs/mysql/issues/1507 y sigue abierto, después de 3 años, a partir de julio de 2019. (ACTUALIZACIÓN de junio de 2019: hay una nueva PR en mysqljs ahora para corregir ¡esta!)

Sus opciones

Opción 1) Bajar la versión "MySQL" para autenticarse usando una antigua "native_password" antigua

Eso es lo que todo el mundo sugiere aquí (p. Ej., La respuesta más arriba ). Simplemente mysql a mysql y ejecute una consulta diciendo que la root está bien usando el antiguo método native_password para la autoetiquetación:

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

Lo bueno es que la vida será simple y aún puedes usar buenas herramientas antiguas como Sequel Pro sin ningún problema . Pero el problema es que no está aprovechando las cosas más seguras (y geniales, lea a continuación) disponibles para usted.

Opción 2) Reemplace el paquete "Nodo" con MySQL Connecter X DevAPI

MySQL X DevAPI para Nodo es un reemplazo para el paquete Mysqljs de Node , proporcionado por http://dev.mysql.com oficiales.

Funciona como un encanto que caching_sha2_password autenticación caching_sha2_password . (Solo asegúrese de usar el puerto 33060 para las 33060 del protocolo X ).

Lo malo es que dejaste nuestro antiguo paquete mysql que todos mysql tan acostumbrados y en el que confían.

¡Lo bueno es que tu aplicación es más segura ahora y puedes aprovechar un montón de cosas nuevas que nuestros viejos amigos no brindaron! Solo revisa el tutorial de X DevAPI y verás que tiene un montón de nuevas características atractivas que pueden ser útiles. Solo tiene que pagar el precio de una curva de aprendizaje, que se espera que venga con cualquier actualización tecnológica. :)

PD. Desafortunadamente, este paquete XDevAPI aún no tiene definición de tipos (comprensible por TypeScript), por lo que si está en escritura de tipos, tendrá problemas. Intenté generar .d.ts usando dts-gen y dtsmake , pero no dtsmake éxito. Así que tenlo en mente.

¡Aclamaciones!


Si encuentra este error pero aún desea usar la versión 8 de MySQL, puede hacerlo indicando al servidor MySQL que use el complemento de autenticación heredado cuando cree la base de datos utilizando Docker.

Por lo tanto, su archivo compuesto se verá así:

# 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

Simplemente ejecute MySQL Server Installer y reconfigure My SQL Server ... Esto funcionó para mí.


Tengo MYSQL en el servidor y la aplicación nodejs en otro servidor

Ejecutar la siguiente consulta en MYSQL Workbench

ALTERE AL USUARIO 'root' @ '%' IDENTIFICADO CON mysql_native_password POR 'password'


Usando el antiguo mysql_native_password funciona:

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;

Esto se debe a que caching_sha2_password se introdujo en MySQL 8.0, pero la versión Node.js aún no está implementada. Puede ver esta solicitud de extracción y este problema para obtener más información. Probablemente una solución vendrá pronto!


Verifique los privilegios y el nombre de usuario / contraseña de su usuario de MySQL.

Para detectar errores, siempre es útil utilizar el método _delegateError . En tu caso esto tiene que verse como:

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

Esta construcción te ayudará a rastrear errores fatales.





node.js