MySQL 8.0 - Il client non supporta il protocollo di autenticazione richiesto dal server; considerare l'aggiornamento del client MySQL


274

Non riesco a stabilire una semplice connessione al server per qualche motivo. Installo il più recente database MySQL Community 8.0 insieme a Node.JS con le impostazioni predefinite.

Questo è il mio codice 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!");
    });

Di seguito è riportato l'errore riscontrato nel prompt dei comandi:

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)

Ho letto alcune cose come: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507

Ma non sono ancora sicuro di come risolvere il mio problema. Qualsiasi aiuto sarebbe apprezzato: D


2
Tutti gli utenti di VS Code che usano l'estensione SQLTools dovrebbero fare riferimento a questo post nel caso in cui abbiano problemi con questo, specialmente se hai appena aggiornato un'istanza mysql sul tuo computer di sviluppo
OzzyTheGiant,

Risposte:


680

Eseguire la seguente query in MYSQL Workbench

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

Dove rootcome utente localhostcome URL e passwordcome password

Quindi eseguire questa query per aggiornare i privilegi:

flush privileges;

Prova a connetterti utilizzando il nodo dopo averlo fatto.

Se non funziona, provalo senza @'localhost'parte.


47
Questo ha funzionato per me. Non dimenticare di flush privileges;dopo.
Ali Hesari,

12
Ha funzionato per me senza @localhost (suppongo che potrebbe essere perché non era per l'utente root)
NicolasZ

10
sostituisci 'password' con la tua password di root se la conosci
Vedha Peri,

11
Funziona ...... ma perché non funzionava prima e perché ha funzionato dopo questa query è ancora una domanda.
Saksham,

9
Ciao @GuilhermeMatuella Questo perché caching_sha2_passwordè stato introdotto in MySQL 8.0, ma la versione di Node.js non è ancora implementata.
Daksh Gargas,

108

Per prima cosa chiariamo cosa sta succedendo.

MySQL 8 supporta metodi di autenticazione collegabili. Per impostazione predefinita, caching_sha2_passwordviene utilizzato uno di essi denominato anziché il nostro buon vecchio mysql_native_password( fonte ). Dovrebbe essere ovvio che l'uso di un algoritmo crittografico con più strette di mano è più sicuro del semplice passaggio di password che esiste da 24 anni !

Ora, il problema è mysqljsin Node (il pacchetto con cui si installa npm i mysqle lo si utilizza nel codice Node) non supporta ancora questo nuovo metodo di autenticazione predefinito di MySQL 8. Il problema è qui: https://github.com/mysqljs/mysql/issues/1507 ed è ancora aperto, dopo 3 anni, a luglio 2019.

(AGGIORNAMENTO Giugno 2019: ora c'è un nuovo PR in mysqljs per risolvere questo problema! ) (AGGIORNAMENTO Febbraio 2020: Apparentemente è previsto che arrivi nella versione 3 di mysqljs . )

Le tue opzioni

Opzione 1) Esegui il downgrade di "MySQL" per eseguire l'autenticazione utilizzando la vecchia "password_madrina"

Questo è ciò che tutti suggeriscono qui (ad esempio la risposta più sopra sopra ). Basta entrare mysqled eseguire una query dicendo che rootva bene usando il vecchio native_passwordmetodo per l'authnetication:

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

La cosa buona è che la vita sarà semplice e puoi comunque usare buoni vecchi strumenti come Sequel Pro senza alcun problema . Ma il problema è che non stai approfittando di un materiale più sicuro (e interessante, leggi sotto) a tua disposizione.

Opzione 2) Sostituisci il pacchetto "Nodo" con MySQL Connecter X DevAPI

MySQL X DevAPI per Node è un sostituto del pacchetto Mysqljs di Node , fornito dai ragazzi ufficiali di http://dev.mysql.com .

Funziona come un incantesimo che supporta l' caching_sha2_passwordautenticazione. (Assicurati solo di usare la porta 33060per le comunicazioni del protocollo X. )

La cosa brutta è che hai lasciato il nostro vecchio mysqlpacchetto a cui tutti sono così abituati e su cui fanno affidamento.

Il bello è che la tua app è ora più sicura e puoi approfittare di moltissime novità che i nostri buoni vecchi amici non hanno fornito! Dai un'occhiata al tutorial di X DevAPI e vedrai che ha un sacco di nuove funzionalità sexy che possono tornare utili. Hai solo bisogno di pagare il prezzo di una curva di apprendimento, che prevede un eventuale aggiornamento tecnologico. :)

PS. Sfortunatamente, questo pacchetto XDevAPI non ha ancora la definizione dei tipi (comprensibile da TypeScript), quindi se sei su typescript , avrai dei problemi. Ho provato a generare .d.ts usando dts-gene dtsmake, ma senza successo. Quindi tienilo a mente.

Saluti!


3
Grazie per aver pubblicato una risposta dettagliata per una domanda di un anno. :]
Daksh Gargas,

3
bello, una risposta che in realtà spiega mysql_native_password invece di dirti semplicemente di farlo
wizloc

1
Sì, una spiegazione corretta per una volta. Buono con te Aidin. Come vorrei che il collegamento delle app non configurasse automaticamente la porta 3306 su MySQL. Abbiamo abbastanza problemi a distogliere MySQL e MariaDB dal 3306.
Trunk


Questa è una risposta eccellente che merita più voti!
Giugno Wenston,

82

Usando le vecchie mysql_native_passwordopere:

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;

Questo perché caching_sha2_passwordè stato introdotto in MySQL 8.0, ma la versione di Node.js non è ancora implementata. Puoi visualizzare questa richiesta pull e questo problema per ulteriori informazioni. Probabilmente una soluzione arriverà presto!


Lavora come un fascino. Che sollievo!
cappello

qual è la differenza tra l'aggiunta di @localhost e solo 'root'
filemonczyk il

La query funziona. Ma il nodo non è riuscito a connettersi al server MySQL. Qualche idea? Ecco l'errore, {"code": "ER_ACCESS_DENIED_ERROR", "errno": 1045, "sqlMessage": "Accesso negato per l'utente 'root' @ 'localhost' (usando la password: YES)", "sqlState": "28000" , "fatale": vero}
Sanjay Pradeep,

26

Passaggi completi per MySQL 8

Connettiti a MySQL

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

reimposta la tua password

(Sostituisci your_new_passwordcon la password che desideri utilizzare)

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

Quindi prova a connetterti utilizzando il nodo


@sky vedi la mia risposta sopra per i dettagli.
Aidin,

1
@Aidin Grazie, è molto utile.
Sky,

17

Sebbene la risposta accettata sia corretta, preferirei creare un nuovo utente e quindi utilizzarlo per accedere al database.

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

2
Se qualcuno vuole seguire questa strada, ecco un articolo con alcune spiegazioni: digitalocean.com/community/tutorials/…
Devin,

12

Se hai riscontrato questo errore ma desideri comunque utilizzare la MySQLversione 8. Puoi farlo dicendo a MySQL Server di utilizzare il plug-in di autenticazione legacy quando crei il database usando Docker.

Quindi, il tuo composefile sarà simile al seguente:

# 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

Sto usando questo command, ma ricevo ancora il messaggio di errore di autenticazione non supportato quando si utilizza mysqlin Node.js
Juha Untinen

Lo stacktrace completo è qui: pastebin.com/SzayQzdh e docker-compose.yml : pastebin.com/7pUrWYDs L'errore stesso è:Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
Juha Untinen

1
@JuhaUntinen assicurati di aver rimosso un contenitore Docker (quello creato da docker-compose) e il volume (~ / Database / ORM_Test) e quindi esegui di nuovo 'docker-compose up'. Altrimenti le modifiche da 'comando' non verranno applicate. Mi ha aiutato nel mio caso.
Vitalii Ivanov,

11

In Mysql Ultimo contenitore docker

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';

9

Se la riga di comando ALTER USER ... non funziona per te E se stai utilizzando Windows 10, prova a seguire questi passaggi:

1) Digitare MySQL nella barra di ricerca di Windows

2) Apri MySQL Windows Installer - Community

3) Cerca "Server MySQL" e fai clic su Riconfigura passaggio 3

4) Fare clic su "Avanti" fino a raggiungere la fase "Metodo di autenticazione"

5) Nella fase "Metodo di autenticazione" selezionare la seconda opzione "Usa metodo di autenticazione legacy" passaggio 5

6) Quindi seguire i passaggi indicati dal programma di installazione di Windows fino alla fine

7) Al termine, accedi a "Servizi" dalla barra di ricerca di Windows, fai clic su "avvia" MySql81 ".

Ora riprova, la connessione tra MySQL e Node.js dovrebbe funzionare!


4

In MySQL 8.0, caching_sha2_passwordè il plug-in di autenticazione predefinito anzichémysql_native_password. ...

La maggior parte delle risposte a questa domanda comporta un downgrade al meccanismo di autenticazione da caching_sha2_passworda mysql_native_password. Dal punto di vista della sicurezza, questo è abbastanza deludente.

Questo documento discute ampiamente caching_sha2_passworde ovviamente perché NON dovrebbe essere una prima scelta per il downgrade del metodo di autenticazione.

Con ciò, credo che la risposta di Aidin dovrebbe essere la risposta accettata. Invece di eseguire il downgrade del metodo di autenticazione, utilizzare un connettore che corrisponda invece alla versione del server.


3

Documentazione originale che puoi trovare qui: 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);
  });

Sembra più complicato, ma penso che dovremmo seguire la guida ufficiale! b
Juneyoung Oh,

3

Ho MYSQL sul server e l'applicazione nodejs su un altro server

Eseguire la seguente query in MYSQL Workbench

ALTER USER 'root' @ '%' IDENTIFICATO CON mysql_native_password DA 'password'


2

Con MySQL 8+ la nuova autenticazione predefinita è caching_sha2_passwordinvece di mysql_native_password. Il nuovo e più sicuro metodo di autenticazione non è ancora supportato dal mysqlpacchetto nativo , ma dovresti prendere in considerazione l'utilizzo del pacchetto @mysql/xdevapi, che è ufficialmente supportato e gestito da Oracle.

Per installare il nuovo pacchetto, eseguire:

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

Per connettersi al database e INSERIRE alcuni VALORI:

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 documentazione ufficiale del pacchetto è disponibile qui: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/


2

Se stai usando la finestra mobile, ha funzionato per me!

nel docker-compose.ymlaggiungere le seguenti righe:

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

dopo quello, downil contenitore e upancora.


2

Per installazioni mysql 8.0 esistenti su mysql di Windows 10,

  1. avvia installer,

  2. fai clic su "Riconfigura" in QuickAction (a sinistra di MySQL Server), quindi

  3. fai clic su Avanti per avanzare tra le 2 schermate successive fino all'arrivo

  4. in "Metodo di autenticazione", seleziona "Usa metodo di autenticazione legacy (Mantieni compatibilità MySQL 5.x"

  5. Continua a fare clic fino al completamento dell'installazione


1

Oltre alle risposte di cui sopra; Dopo aver eseguito il comando seguente

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

Se ricevi un errore come:

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

Quindi prova nel cmd come admin; imposta il percorso della cartella bin del server MySQL nel cmd

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

e quindi esegui il comando:

mysql_upgrade --force -uroot -p

Questo dovrebbe aggiornare il server e le tabelle di sistema.

Quindi dovresti essere in grado di eseguire correttamente i seguenti comandi in una query nel Workbench:

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

quindi ricorda di eseguire il seguente comando:

flush privileges;

Dopo tutti questi passaggi dovrebbe essere in grado di connettersi correttamente al database MySQL. Spero che questo ti aiuti...


0

Basta eseguire MySQL Server Installer e riconfigurare My SQL Server ... Questo ha funzionato per me.


0

Controlla i privilegi e il nome utente / la password per il tuo utente MySQL.

Per rilevare errori è sempre utile utilizzare il _delegateErrormetodo override . Nel tuo caso questo dovrebbe apparire come:

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

Questa costruzione ti aiuterà a tracciare errori fatali.


0

Ho appena capito questo dopo aver provato numerose cose. Quello che finalmente ha fatto per me è stato l'aggiunta require('dotenv').config()al mio .sequelizercfile. Apparentemente sequelize-cli non legge le variabili env.


0

È possibile saltare l'ORM, i costruttori, ecc. E semplificare la gestione di DB / SQL utilizzando sqlere 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');
});

0

Il downgrade potrebbe non essere una buona opzione come:

  1. È stato aggiornato per un motivo (per fornire una migliore autenticazione).
  2. Potresti non disporre di autorizzazioni sufficienti per apportare tali modifiche.

È possibile utilizzare il mysql2pacchetto al posto di mysql. È principalmente API compatibile con mysqljs. Inoltre, ha promesso supporto.

Usalo come: const mysql = require('mysql2/promise')

Puoi leggere di più mysql2qui: https://www.npmjs.com/package/mysql2

Spero che sia d'aiuto. :)


-1

Ho lo stesso problema con MySQL e risolvo usando XAMPP per connettermi con MySQL e interrompere i servizi in Windows per MySQL (pannello di controllo - Strumenti di amministrazione - Servizi) e nella cartella db.js (quella responsabile del database) I rendere vuota la password (qui puoi vedere :)

const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: ''
});

per favore non aggiungere un problema che stai affrontando come risposta al problema affrontato
Aloy A Sen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.