MySQL 8.0 - O cliente não suporta o protocolo de autenticação solicitado pelo servidor; considere atualizar o cliente MySQL

274

Não consigo fazer uma conexão simples com o servidor por algum motivo. Eu instalo o mais novo banco de dados MySQL Community 8.0 junto com o Node.JS com as configurações padrão.

Este é o meu 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!");
    });

Abaixo está o erro encontrado no prompt de comando:

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)

Eu li algumas coisas como: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507

Mas ainda não tenho certeza de como resolver meu problema. Qualquer ajuda seria apreciada: D

Porco
fonte
2
Todos os usuários de código VS que usam extensão SQLTools deve referir-se a este post em caso eles estão tendo problemas com isso, especialmente se você apenas atualizado uma instância mysql no computador de desenvolvimento
OzzyTheGiant

Respostas:

679

Execute a seguinte consulta no MYSQL Workbench

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

Onde, rootcomo usuário, localhostcomo URL e passwordsenha

Em seguida, execute esta consulta para atualizar os privilégios:

flush privileges;

Tente conectar-se usando o nó depois de fazer isso.

Se isso não funcionar, tente sem @'localhost'parte.

Pras
fonte
47
Isso funcionou para mim. Não esqueça de flush privileges;depois.
Ali Hesari 5/08/19
12
Ela trabalhou para mim sem a @localhost (i acho que poderia ser porque não era para o usuário root)
NicolasZ
10
substituir 'password' com sua senha de root se você sabe disso
Vedha Peri
11
Funciona ...... mas por que não estava funcionando antes e por que funcionou após esta consulta ainda é uma pergunta.
saksham
9
Olá, @GuilhermeMatuella Isso ocorre porque caching_sha2_passwordé introduzido no MySQL 8.0, mas a versão do Node.js. ainda não foi implementada.
Daksh Gargas
108

Vamos primeiro esclarecer o que está acontecendo.

O MySQL 8 suporta métodos de autenticação conectáveis. Por padrão, um deles nomeado caching_sha2_passwordé usado, e não o nosso bom e velho mysql_native_password( fonte ). Deveria ser óbvio que o uso de um algoritmo de criptografia com vários handshakes é mais seguro do que a simples passagem de senha que existe há 24 anos !

Agora, o problema está mysqljsno Node (o pacote com o qual você instala npm i mysqle o usa no código do Node) ainda não suporta esse novo método de autenticação padrão do MySQL 8. O problema está aqui: https://github.com/mysqljs/mysql/issues/1507 e ainda está aberto, após três anos, a partir de julho de 2019.

(ATUALIZAÇÃO junho 2019: Há uma nova PR em mysqljs agora para corrigir isso! ) (ATUALIZAÇÃO fevereiro 2020: Aparentemente, ele está programado para entrar na versão 3 do mysqljs . )

Suas opções

Opção 1) Faça o downgrade do "MySQL" para autenticar usando o bom e antigo "native_password"

Isso é o que todos sugerem aqui (por exemplo, resposta principal acima ). Você acabou de entrar mysqle executar uma consulta dizendo que rootestá bem usando o native_passwordmétodo antigo para autnetication:

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

O bom é que a vida será simples e você ainda poderá usar boas ferramentas antigas como o Sequel Pro sem nenhum problema . Mas o problema é que você não está tirando proveito de materiais mais seguros (e legais, leia abaixo) disponíveis para você.

Opção 2) Substitua o pacote "Node" pelo MySQL Connecter X DevAPI

O MySQL X DevAPI for Node é um substituto do pacote Mysqljs do Node , fornecido por http://dev.mysql.com pessoal oficial.

Funciona como um encanto que suporta caching_sha2_passwordautenticação. (Apenas certifique-se de usar a porta 33060para comunicações do protocolo X. )

O ruim é que você deixou o nosso mysqlpacote antigo com o qual todos estão tão acostumados e confiam.

O bom é que seu aplicativo está mais seguro agora e você pode aproveitar uma tonelada de novidades que nossos bons e velhos amigos não forneceram! Basta dar uma olhada no tutorial do X DevAPI e você verá que ele tem vários novos recursos sexy que podem ser úteis. Você só precisa pagar o preço de uma curva de aprendizado, que é esperada com qualquer atualização de tecnologia. :)

PS. Infelizmente, este pacote XDevAPI ainda não possui definição de tipos (compreensível pelo TypeScript); portanto, se você estiver com texto datilografado , terá problemas. Tentei gerar .d.ts usando dts-gene dtsmake, mas sem sucesso. Portanto, tenha isso em mente.

Felicidades!

Auxílio em
fonte
3
Obrigado por postar uma resposta detalhada para uma pergunta de um ano. :]
Daksh Gargas
3
agradável, uma resposta que realmente explica mysql_native_password em vez de apenas dizer-lhe para fazê-lo
wizloc
1
Sim, uma explicação adequada pela primeira vez. Bom em você, Aidin. Como desejo conectar aplicativos não configurou automaticamente a porta 3306 para o MySQL. Já temos problemas suficientes valorizando MySQL e MariaDB longe de 3306.
Trunk
Tenha cuidado com plugins da Oracle, você pode obter uma grande penalidade: theregister.co.uk/2019/10/04/oracle_virtualbox_merula
Juha Untinen
Esta é uma excelente resposta que merece mais votos!
June Wenston
82

Usando os mysql_native_passwordtrabalhos antigos :

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;

Isso ocorre porque caching_sha2_passwordé introduzido no MySQL 8.0, mas a versão do Node.js. ainda não está implementada. Você pode ver esta solicitação de recebimento e esse problema para obter mais informações. Provavelmente uma solução virá em breve!

upupming
fonte
Trabalhe como um encanto. Que alivio!
hat
Qual a diferença entre adicionando @localhost e apenas 'root'
filemonczyk
Consulta funciona. Mas o nó ainda não pôde se conectar ao servidor MySQL. Qualquer ideia? Aqui está o erro, {"code": "ER_ACCESS_DENIED_ERROR", "errno": 1045, "sqlMessage": "Acesso negado para o usuário 'root' @ 'localhost' (usando a senha: YES)", "sqlState": "28000" , "fatal": true}
Sanjay Pradeep
26

Etapas completas para o MySQL 8

Conecte-se ao MySQL

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

Redefina sua senha

(Substitua your_new_passwordpela senha que você deseja usar)

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

Em seguida, tente conectar-se usando o nó

joshuakcockrell
fonte
@sky, veja minha resposta acima para obter detalhes.
Aidin
1
@Aidin Obrigado, é muito útil.
Sky
17

Embora a resposta aceita esteja correta, prefiro criar um novo usuário e depois usá-lo para acessar o banco de dados.

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
fonte
2
Se alguém quiser ir por esse caminho, aqui está um artigo com alguma explicação: digitalocean.com/community/tutorials/...
Devin
12

Se você encontrou esse erro, mas ainda desejava usar a MySQLversão 8. Você pode conseguir isso dizendo ao MySQL Server para usar o plug-in de autenticação herdado ao criar o banco de dados Docker.

Portanto, seu composearquivo ficará assim:

# 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
fonte
Estou usando este command, mas ainda está recebendo a mensagem de erro de autenticação sem suporte ao usar mysqlem Node.js
Juha Untinen
O stacktrace completo está aqui: pastebin.com/SzayQzdh e o docker-compose.yml : pastebin.com/7pUrWYDs O erro em si é:Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
Juha Untinen
1
@JuhaUntinen certifique-se de remover um contêiner do Docker (aquele criado pelo docker-compose) e volume (~ / Database / ORM_Test) e execute 'docker-compose up' novamente. Caso contrário, as alterações de 'comando' não serão aplicadas. Isso ajudou no meu caso.
Vitalii Ivanov 6/11/19
11

No contêiner de docker mais recente do Mysql

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

Se a linha de comando ALTER USER ... não funcionar para você E se você estiver usando o Windows 10, tente seguir estas etapas:

1) Digite MySQL na barra de pesquisa do Windows

2) Abra o MySQL Windows Installer - Comunidade

3) Procure por "servidor MySQL" e clique em Reconfigurar etapa 3

4) Clique em "Avançar" até chegar à fase "Método de autenticação"

5) Na fase "Método de autenticação", verifique a segunda opção "Usar método de autenticação herdado" passo 5

6) Siga as etapas fornecidas pelo instalador do Windows até o final

7) Quando terminar, entre em "Serviços" na barra de pesquisa do Windows, clique em "Iniciar" MySql81 ".

Agora, tente novamente, a conexão entre MySQL e Node.js deve funcionar!

Campalo
fonte
4

No MySQL 8.0, caching_sha2_passwordé o plug-in de autenticação padrão em vez demysql_native_password. ...

A maioria das respostas nesta pergunta resulta em um downgrade para o mecanismo de autenticação de caching_sha2_passwordpara mysql_native_password. Do ponto de vista da segurança, isso é bastante decepcionante.

Este documento discute extensivamente caching_sha2_passworde, é claro, por que NÃO deve ser a primeira opção para fazer o downgrade do método de autenticação.

Com isso, acredito que a resposta de Aidin deve ser a resposta aceita. Em vez de fazer o downgrade do método de autenticação, use um conector que corresponda à versão do servidor.

Lester
fonte
3

Documentação original que você pode encontrar aqui: 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
fonte
Parece mais complicado, mas acho que devemos seguir o guia oficial! b
Juneyoung Oh
3

Eu tenho o MYSQL no servidor e o aplicativo nodejs em outro servidor

Execute a seguinte consulta no MYSQL Workbench

ALTER USUÁRIO 'root' @ '%' IDENTIFICADO COM mysql_native_password BY 'password'

iomar
fonte
2

Para instalações existentes do mysql 8.0 no Windows 10 mysql,

(1) instalador de lançamento,

(2) clique em "Reconfigurar" em QuickAction (à esquerda do MySQL Server), depois

(3) clique em Avançar para avançar pelas próximas 2 telas até chegar

(4) em "Método de autenticação", selecione "Usar método de autenticação herdado (mantenha a compatibilidade do MySQL 5.x"

(5) Continue clicando até a instalação ser concluída

Charles Goodwin
fonte
2

Com o MySQL 8+, a nova autenticação padrão é em caching_sha2_passwordvez de mysql_native_password. O novo e mais seguro método de autenticação ainda não é suportado pelo mysqlpacote nativo , mas você deve considerar o uso do pacote @mysql/xdevapi, que é oficialmente suportado e mantido pela Oracle.

Para instalar o novo pacote, execute:

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

Para conectar-se ao banco de dados e INSERIR alguns 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()
    });

A documentação oficial do pacote pode ser encontrada aqui: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/

Druida Ancião
fonte
2

Se você estiver usando o docker, funcionou para mim!

no docker-compose.ymladicione as seguintes linhas:

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

depois disso, downo recipiente e upnovamente.

Leo
fonte
1

Além das respostas acima; Depois de executar o comando abaixo

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

Se você receber um erro como:

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

Em seguida, tente no cmd como administrador; defina o caminho para a pasta bin do servidor MySQL no cmd

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

e, em seguida, execute o comando:

mysql_upgrade --force -uroot -p

Isso deve atualizar o servidor e as tabelas do sistema.

Em seguida, você poderá executar com êxito os comandos abaixo em uma Consulta no Workbench:

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

lembre-se de executar o seguinte comando:

flush privileges;

Após todas essas etapas, você poderá se conectar com sucesso ao seu banco de dados MySQL. Espero que isto ajude...

Madhawa Jayagoda
fonte
0

Basta executar o MySQL Server Installer e reconfigurar o My SQL Server ... Isso funcionou para mim.

Alexander Burias
fonte
0

Verifique privilégios e nome de usuário / senha para o seu usuário MySQL.

Para detectar erros, é sempre útil usar o _delegateErrormétodo substituído . No seu caso, isso deve se parecer com:

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

Essa construção o ajudará a rastrear erros fatais.

B. Bohdan
fonte
0

Só descobri isso depois de tentar várias coisas. O que finalmente fez por mim foi adicionar require('dotenv').config()ao meu .sequelizercarquivo. Aparentemente, sequelize-cli não lê variáveis ​​env.

gbland777
fonte
0

A Classificação para baixo pode não ser uma boa opção, pois:

  1. Sua atualização por um motivo (Para fornecer melhor autenticação).
  2. Você pode não ter permissões suficientes para fazer essas alterações.

Você pode usar o mysql2pacote no lugar de mysql. É principalmente API compatível com mysqljs. Além disso, tem suporte promissor.

Use-o como: const mysql = require('mysql2/promise')

Você pode ler mais sobre mysql2aqui: https://www.npmjs.com/package/mysql2

Espero que ajude. :)

Salim Shamim
fonte
0

Você pode pular o ORM, construtores, etc. e simplificar o gerenciamento de DB / SQL usando 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');
});
ugate
fonte
-1

Tenho o mesmo problema com o MySQL e resolvo usando o XAMPP para conectar-me ao MySQL e interromper os serviços no Windows para MySQL (painel de controle - Ferramentas Administrativas - Serviços) e na pasta db.js (responsável pelo banco de dados). deixe a senha vazia (aqui você pode ver :)

const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: ''
});
Mohammad Jouza
fonte
por favor, não adicione um problema que você esteja enfrentando como resposta ao problema enfrentado
Aloy A Sen