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

274

No puedo hacer una conexión simple al 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 sobre 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

Cerdo
fuente
2
Todos los usuarios de VS Code que usan la extensión SQLTools deben consultar esta publicación en caso de que tengan problemas con esto, especialmente si acaba de actualizar una instancia de mysql en su computadora de desarrollo
OzzyTheGiant

Respuestas:

680

Ejecute la siguiente consulta en MYSQL Workbench

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

Donde rootcomo usuario localhostcomo URL y passwordcomo contraseña

Luego ejecute esta consulta para actualizar los privilegios:

flush privileges;

Intente conectarse usando el nodo después de hacerlo.

Si eso no funciona, pruébalo sin @'localhost'parte.

Pras
fuente
47
Esto funcionó para mí. No te olvides de flush privileges;después.
Ali Hesari
12
Funcionó para mí sin el @localhost (supongo que podría ser porque no era para el usuario raíz)
NicolasZ
10
reemplace 'contraseña' con su contraseña raíz si la conoce
Vedha Peri
11
Funciona ... pero por qué no funcionaba antes y por qué funcionó después de esta consulta sigue siendo una pregunta.
saksham
9
Hola @GuilhermeMatuella Esto se debe a que caching_sha2_passwordse introdujo en MySQL 8.0, pero la versión Node.js aún no está implementada.
Daksh Gargas
108

Primero dejemos en claro lo que está sucediendo.

MySQL 8 tiene soporte para métodos de autenticación conectables. Por defecto, uno de ellos nombrado caching_sha2_passwordse utiliza en lugar de nuestro viejo bien mysql_native_password( fuente ). ¡Debería ser obvio que usar un algoritmo criptográfico con varios apretones de manos es más seguro que el simple paso de contraseña que ha estado allí durante 24 años !

Ahora, el problema está mysqljsen Node (el paquete con el que lo instala npm i mysqly lo usa en su código de Node) aún no admite este nuevo método de autenticación predeterminado de MySQL 8. El problema está aquí: https://github.com/mysqljs/mysql/issues/1507 y aún está abierto, después de 3 años, a partir de julio de 2019.

(ACTUALIZACIÓN en junio de 2019: ¡ahora hay un nuevo RP en mysqljs para solucionarlo! ) (ACTUALIZACIÓN en febrero de 2020: aparentemente está programado para la versión 3 de mysqljs ) .

Sus opciones

Opción 1) Reduzca la versión de "MySQL" para autenticar usando la buena "contraseña_natal"

Eso es lo que todo el mundo sugiere aquí (por ejemplo, la respuesta más arriba ). Simplemente ingresa mysqly ejecuta una consulta que dice que rootestá bien usando el native_passwordmétodo anterior para la autenticación:

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

Lo bueno es que la vida será simple y todavía 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 Node es un reemplazo del paquete Mysqljs de Node , proporcionado por los chicos oficiales de http://dev.mysql.com .

Funciona como un encanto que admite la caching_sha2_passwordautenticación. (Solo asegúrese de usar el puerto 33060para las comunicaciones del Protocolo X ).

Lo malo es que has dejado nuestro mysqlpaquete anterior en el que todos estamos tan acostumbrados y confiamos.

¡Lo bueno es que su aplicación es más segura ahora y puede aprovechar un montón de cosas nuevas que nuestros viejos amigos no proporcionaron! Solo echa un vistazo al tutorial de X DevAPI y verás que tiene un montón de nuevas características sexys 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 una definición de tipos (comprensible por TypeScript), por lo que si está en typecript , tendrá problemas. Traté de generar .d.ts usando dts-geny dtsmake, pero no tuve éxito. Así que tenlo en mente.

¡Salud!

Ayuda en
fuente
3
Gracias por publicar una respuesta detallada para una pregunta de un año. :]
Daksh Gargas
3
bueno, una respuesta que realmente explica mysql_native_password en lugar de solo decirte que lo hagas
wizloc
1
Sí, una explicación adecuada por una vez. Bien por ti, Aidin. Cómo deseo conectar aplicaciones no configuró automáticamente el puerto 3306 a MySQL. Tenemos suficientes problemas para valorar MySQL y MariaDB lejos de 3306.
Trunk
Tenga cuidado con los complementos de Oracle, puede recibir una gran penalización: theregister.co.uk/2019/10/04/oracle_virtualbox_merula
Juha
Esta es una excelente respuesta merece más votos a favor!
June Wenston
82

Usando los viejos mysql_native_passwordtrabajos:

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_passwordse 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!

estimulante
fuente
Trabajar como un encanto. ¡Qué alivio!
sombrero
¿Cuál es la diferencia entre agregar @localhost y solo 'root'?
filemonczyk
La consulta funciona. Pero aún así el nodo no pudo conectarse al servidor MySQL. ¿Alguna idea? Aquí está el error, {"código": "ER_ACCESS_DENIED_ERROR", "errno": 1045, "sqlMessage": "Acceso denegado para el usuario 'root' @ 'localhost' (usando la contraseña: YES)", "sqlState": "28000" , "fatal": verdadero}
Sanjay Pradeep
26

Pasos completos para MySQL 8

Conéctese a MySQL

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

Restablecer su contraseña

(Reemplace your_new_passwordcon 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

Luego intente conectarse usando el nodo

joshuakcockrell
fuente
@sky ver mi respuesta arriba para los detalles.
Aidin
1
@Aidin Gracias, es muy útil.
Cielo
17

Aunque la respuesta aceptada es correcta, preferiría crear un nuevo usuario y luego usar ese usuario para acceder a la base de datos.

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';
Siddhant
fuente
2
Si alguien quiere seguir esta ruta, aquí hay un artículo con alguna explicación: digitalocean.com/community/tutorials/…
Devin
12

Si encontró este error pero aún quería usar la MySQLversión 8. Puede lograrlo diciéndole a MySQL Server que use el complemento de autenticación heredado cuando cree la base de datos usando Docker.

Entonces, su composearchivo 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
Rico
fuente
Estoy usando esto command, pero sigo recibiendo el mensaje de error de autenticación no compatible cuando lo uso mysqlen Node.js
Juha Untinen
El seguimiento completo de la pila está aquí: pastebin.com/SzayQzdh y docker-compose.yml : pastebin.com/7pUrWYDs El error en sí es:Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
Juha Untinen
1
@JuhaUntinen asegúrese de haber eliminado un contenedor Docker (el creado por docker-compose) y el volumen (~ / Database / ORM_Test) y luego ejecute 'docker-compose up' nuevamente. De lo contrario, los cambios de 'comando' no se aplicarán. Ayudó en mi caso.
Vitalii Ivanov el
11

En Mysql Latest docker container

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';
MacielJr
fuente
9

Si la línea de comando ALTER USER ... no funciona para usted Y si está utilizando Windows 10, intente seguir esos pasos:

1) Escriba MySQL en la barra de búsqueda de Windows

2) Abra el instalador de Windows MySQL - Comunidad

3) Busque "servidor MySQL" y haga clic en Reconfigurar paso 3

4) Haga clic en "Siguiente" hasta llegar a la fase "Método de autenticación"

5) En la fase "Método de autenticación", marque la segunda opción "Usar método de autenticación heredado" paso 5

6) Luego siga los pasos dados por el instalador de Windows hasta el final

7) Cuando termine, vaya a "Servicios" desde la barra de búsqueda de Windows, haga clic en "iniciar" MySql81 ".

Ahora, intente nuevamente, ¡la conexión entre MySQL y Node.js debería funcionar!

Campalo
fuente
4

En MySQL 8.0, caching_sha2_passwordes el complemento de autenticación predeterminado en lugar demysql_native_password. ...

La mayoría de las respuestas en esta pregunta resultan en una degradación del mecanismo de autenticación de caching_sha2_passworda mysql_native_password. Desde una perspectiva de seguridad, esto es bastante decepcionante.

Este documento analiza ampliamente caching_sha2_passwordy, por supuesto, por qué NO debería ser una primera opción para degradar el método de autenticación.

Con eso, creo que la respuesta de Aidin debería ser la respuesta aceptada. En lugar de degradar el método de autenticación, use un conector que coincida con la versión del servidor.

Lester
fuente
3

Documentación original que 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);
  });
shivang patel
fuente
Parece más complicado, ¡pero creo que deberíamos seguir la guía oficial! b
Juneyoung Oh
3

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

Ejecute la siguiente consulta en MYSQL Workbench

ALTERAR USUARIO 'root' @ '%' IDENTIFICADO CON mysql_native_password POR 'contraseña'

iomar
fuente
2

Con MySQL 8+, la nueva autenticación predeterminada es en caching_sha2_passwordlugar de mysql_native_password. El nuevo y más seguro método de autenticación aún no es compatible con el mysqlpaquete nativo , pero debería considerar usar el paquete @mysql/xdevapi, que es oficialmente compatible y mantenido por Oracle.

Para instalar el nuevo paquete, ejecute:

npm install @mysql/xdevapi --save --save-exact

Para conectarse a la base de datos e INSERTAR algunos VALORES:

const mysqlx = require('@mysql/xdevapi');
var myTable;

mysqlx
    .getSession({
        user: 'root',
        password: '*****',
        host: 'localhost',
        port: 33060
    })
    .then(function (session) {

    // Accessing an existing table
    myTable = session.getSchema('Database_Name').getTable('Table_Name');

    // Insert SQL Table data
    return myTable
        .insert(['first_name', 'last_name'])
        .values(['John', 'Doe'])
        .execute()
    });

La documentación oficial del paquete se puede encontrar aquí: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/

Druida anciano
fuente
2

Si estás usando Docker, ¡funcionó para mí!

en el docker-compose.ymlagregar las siguientes líneas:

mysql:
   ...    
   command: --default-authentication-plugin=mysql_native_password
   restart: always

después de eso, downel contenedor y upotra vez.

León
fuente
2

Para las instalaciones existentes de mysql 8.0 en Windows 10 mysql,

  1. instalador de lanzamiento,

  2. haga clic en "Reconfigurar" en QuickAction (a la izquierda del servidor MySQL), luego

  3. Haga clic en Siguiente para avanzar por las siguientes 2 pantallas hasta llegar

  4. en "Método de autenticación", seleccione "Usar método de autenticación heredado (Conservar la compatibilidad con MySQL 5.x"

  5. Sigue haciendo clic hasta que se complete la instalación

Charles Goodwin
fuente
1

Además de las respuestas anteriores; Después de ejecutar el siguiente comando

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

Si obtiene un error como:

[ERROR] Column count of mysql.user is wrong. Expected 42, found 44. The table is probably corrupted

Luego intente en el cmd como administrador; establecer la ruta a la carpeta bin del servidor MySQL en el cmd

set path=%PATH%;D:\xampp\mysql\bin;

y luego ejecuta el comando:

mysql_upgrade --force -uroot -p

Esto debería actualizar el servidor y las tablas del sistema.

Entonces debería poder ejecutar con éxito los siguientes comandos en una consulta en el Workbench:

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

luego recuerde ejecutar el siguiente comando:

flush privileges;

Después de todos estos pasos debería poder conectarse con éxito a su base de datos MySQL. Espero que esto ayude...

Madhawa Jayagoda
fuente
0

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

Alexander Burias
fuente
0

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

Para detectar errores, siempre es útil utilizar un _delegateErrormétodo anulado . En su caso, esto tiene que verse así:

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 lo ayudará a rastrear errores fatales.

B. Bohdan
fuente
0

Acabo de resolver esto después de probar numerosas cosas. Lo que finalmente lo hizo por mí fue agregar require('dotenv').config()a mi .sequelizercarchivo. Aparentemente sequelize-cli no lee las variables env.

gbland777
fuente
0

Puede omitir ORM, constructores, etc. y simplificar su administración de DB / SQL usando sqlery sqler-mdb.

-- create this file at: db/mdb/read.table.rows.sql
SELECT TST.ID AS "id", TST.NAME AS "name", NULL AS "report",
TST.CREATED_AT AS "created", TST.UPDATED_AT AS "updated"
FROM TEST TST
WHERE UPPER(TST.NAME) LIKE CONCAT(CONCAT('%', UPPER(:name)), '%') 
const conf = {
  "univ": {
    "db": {
      "mdb": {
        "host": "localhost",
        "username":"admin",
        "password": "mysqlpassword"
      }
    }
  },
  "db": {
    "dialects": {
      "mdb": "sqler-mdb"
    },
    "connections": [
      {
        "id": "mdb",
        "name": "mdb",
        "dir": "db/mdb",
        "service": "MySQL",
        "dialect": "mdb",
        "pool": {},
        "driverOptions": {
          "connection": {
            "multipleStatements": true
          }
        }
      }
    ]
  }
};

// create/initialize manager
const manager = new Manager(conf);
await manager.init();

// .sql file path is path to db function
const result = await manager.db.mdb.read.table.rows({
  binds: {
    name: 'Some Name'
  }
});

console.log('Result:', result);

// after we're done using the manager we should close it
process.on('SIGINT', async function sigintDB() {
  await manager.close();
  console.log('Manager has been closed');
});
ugate
fuente
0

La degradación podría no ser una buena opción ya que:

  1. Se actualizó por una razón (para proporcionar una mejor autenticación).
  2. Es posible que no tenga suficientes permisos para realizar dichos cambios.

Puede usar el mysql2paquete en lugar de mysql. Es principalmente API compatible con mysqljs. Además, tiene promesas de apoyo.

Úselo como: const mysql = require('mysql2/promise')

Puede leer más sobre mysql2aquí: https://www.npmjs.com/package/mysql2

Espero eso ayude. :)

Salim Shamim
fuente
-1

Tengo el mismo problema con MySQL y lo resuelvo usando XAMPP para conectarme con MySQL y detener los servicios en Windows para MySQL (panel de control - Herramientas administrativas - Servicios), y en la carpeta db.js (responsable de la base de datos) I deje la contraseña vacía (aquí puede ver :)

const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: ''
});
Mohammad Jouza
fuente
por favor, no agregue un problema que enfrenta como respuesta al problema que enfrenta
Aloy A Sen