Node.js no puede autenticarse en MySQL 8.0
authentication mysql-8.0 (1)
Tengo un programa Node.js que se conecta a una base de datos MySQL local con la cuenta raíz (esto no es una configuración de producción). Este es el código que crea la conexión:
const mysql = require(''mysql'');
const dbConn = mysql.createConnection({
host: ''localhost'',
port: 3306,
user: ''root'',
password: ''myRootPassword'',
database: ''decldb''
});
dbConn.connect(err => {
if (err) throw err;
console.log(''Connected!'');
});
Funcionó con MySQL 5.7, pero desde la instalación de MySQL 8.0 recibo este error al iniciar la aplicación Node.js:
> node ./api-server/main.js
[2018-05-16T13:53:53.153Z] Server launched on port 3000!
C:/Users/me/project/node_server/node_modules/mysql/lib/protocol/Parser.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/me/project/node_server/node_modules/mysql/lib/protocol/sequences/Sequence.js:52:14)
at Handshake.ErrorPacket (C:/Users/me/project/node_server/node_modules/mysql/lib/protocol/sequences/Handshake.js:130:18)
at Protocol._parsePacket (C:/Users/me/project/node_server/node_modules/mysql/lib/protocol/Protocol.js:279:23)
at Parser.write (C:/Users/me/project/node_server/node_modules/mysql/lib/protocol/Parser.js:76:12)
at Protocol.write (C:/Users/me/project/node_server/node_modules/mysql/lib/protocol/Protocol.js:39:16)
at Socket.<anonymous> (C:/Users/me/project/node_server/node_modules/mysql/lib/Connection.js:103:28)
at emitOne (events.js:116:13)
at Socket.emit (events.js:211:7)
at addChunk (_stream_readable.js:263:12)
at readableAddChunk (_stream_readable.js:250:11)
--------------------
at Protocol._enqueue (C:/Users/me/project/node_server/node_modules/mysql/lib/protocol/Protocol.js:145:48)
at Protocol.handshake (C:/Users/me/project/node_server/node_modules/mysql/lib/protocol/Protocol.js:52:23)
at Connection.connect (C:/Users/me/project/node_server/node_modules/mysql/lib/Connection.js:130:18)
at Object.<anonymous> (C:/Users/me/project/node_server/main.js:27:8)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
Parece que la cuenta de root usa un nuevo método de hashing de contraseña:
> select User,Host,plugin from user where User="root";
+------+-----------+-----------------------+
| User | Host | plugin |
+------+-----------+-----------------------+
| root | localhost | caching_sha2_password |
+------+-----------+-----------------------+
... pero no sé por qué Node.js no puede conectarse a él. He actualizado todos los paquetes npm y sigue siendo un problema.
Me gustaría mantener el nuevo método de hashing de contraseña. ¿Todavía puedo hacer que esta conexión funcione? ¿Tengo que esperar una actualización del paquete MySQL Node.js o cambiar una configuración de mi lado?
MySQL 8.0 utiliza un nuevo complemento de autenticación predeterminado, caching_sha2_password , mientras que MySQL 5.7 usa una diferente: mysql_native_password . Actualmente, los controladores Node.js de la comunidad para MySQL no son compatibles con los mecanismos de autenticación del lado del cliente compatibles para el nuevo complemento del servidor.
Una posible solución es alterar el tipo de cuenta de usuario para usar el antiguo complemento de autenticación:
ALTER USER ''root''@''localhost'' IDENTIFIED WITH mysql_native_password BY ''MyNewPass'';
O crea uno diferente que use el mismo complemento:
CREATE USER ''foo''@''localhost'' IDENTIFIED WITH mysql_native_password BY ''bar'';
Hay una solicitud de extracción en trámite para abordar adecuadamente el problema.
Otra opción es usar el conector official MySQL Node.js (revelación completa: soy el desarrollador principal), que se basa en el Protocolo X y ya es compatible con el nuevo modo de autenticación.