MySQL 8.0 - Klien tidak mendukung protokol otentikasi yang diminta oleh server; pertimbangkan untuk memutakhirkan klien MySQL

274

Saya tidak dapat membuat koneksi sederhana ke server karena beberapa alasan. Saya menginstal database MySQL Community 8.0 terbaru bersama dengan Node.JS dengan pengaturan default.

Ini adalah kode node.js saya

    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 bawah ini adalah kesalahan yang ditemukan di Command Prompt:

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)

Saya telah membaca beberapa hal seperti: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507

Tetapi saya masih tidak yakin bagaimana cara memperbaiki masalah saya. Bantuan apa pun akan dihargai: D

Babi
sumber
2
Semua pengguna VS Code yang menggunakan ekstensi SQLTools harus merujuk ke posting ini jika mereka mengalami masalah dengan ini, terutama jika Anda baru saja
memutakhirkan

Jawaban:

679

Jalankan permintaan berikut di MYSQL Workbench

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

Di mana rootsebagai pengguna Anda localhostsebagai URL dan passwordkata sandi Anda

Kemudian jalankan kueri ini untuk menyegarkan hak istimewa:

flush privileges;

Coba sambung menggunakan node setelah Anda melakukannya.

Jika itu tidak berhasil, cobalah tanpa @'localhost'bagian.

Pras
sumber
47
Ini berhasil untuk saya. Jangan lupa flush privileges;setelahnya.
Ali Hesari
12
Ini bekerja untuk saya tanpa @ localhost (saya kira itu bisa jadi karena itu bukan untuk pengguna root)
NicolasZ
10
ganti 'kata sandi' dengan kata sandi root Anda jika Anda tahu
Vedha Peri
11
Ini berfungsi ...... tapi mengapa itu tidak berfungsi sebelumnya dan mengapa itu berhasil setelah permintaan ini masih menjadi pertanyaan.
saksham
9
Hai @GuilhermeMatuella Ini karena caching_sha2_passworddiperkenalkan di MySQL 8.0, tetapi versi Node.js belum diimplementasikan.
Daksh Gargas
108

Pertama mari kita perjelas apa yang terjadi.

MySQL 8 telah mendukung metode otentikasi pluggable. Secara default, salah satu dari mereka yang dinamai caching_sha2_passworddigunakan daripada yang lama mysql_native_password( sumber ) kami. Seharusnya jelas bahwa menggunakan algoritma kripto dengan beberapa jabat tangan lebih aman daripada kata sandi yang telah ada selama 24 tahun !

Sekarang, masalahnya ada mysqljsdi Node (paket yang Anda instal npm i mysqldan gunakan dalam kode Node Anda) belum mendukung metode otentikasi standar baru dari MySQL 8 ini. Masalahnya ada di sini: https://github.com/mysqljs/mysql/issues/1507 dan masih terbuka, setelah 3 tahun, pada Juli 2019.

(UPDATE Juni 2019: Ada PR baru di mysqljs sekarang untuk memperbaikinya! ) (UPDATE Februari 2020: Rupanya dijadwalkan untuk datang dalam versi 3 dari mysqljs . )

Opsi Anda

Opsi 1) Turunkan versi "MySQL" untuk mengautentikasi menggunakan "native_password" lama yang baik

Itulah yang disarankan semua orang di sini (mis. Jawaban teratas di atas ). Anda baru saja masuk mysqldan menjalankan kueri yang mengatakan roottidak apa-apa menggunakan native_passwordmetode lama untuk authnetication:

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

Hal yang baik adalah, hidup akan menjadi sederhana dan Anda masih dapat menggunakan alat-alat lama yang bagus seperti Sequel Pro tanpa masalah . Tetapi masalahnya adalah, Anda tidak mengambil keuntungan dari barang-barang yang lebih aman (dan keren, baca di bawah) yang tersedia untuk Anda.

Opsi 2) Ganti paket "Node" dengan MySQL Connecter X DevAPI

MySQL X DevAPI untuk Node adalah pengganti paket Mysqljs Node , yang disediakan oleh http://dev.mysql.com , kawan .

Ini berfungsi seperti pesona yang mendukung caching_sha2_passwordotentikasi. (Pastikan Anda menggunakan port 33060untuk komunikasi X Protocol .)

Yang buruk adalah, Anda telah meninggalkan mysqlpaket lama kami yang semua orang sudah terbiasa dan andalkan.

Hal baiknya adalah, aplikasi Anda lebih aman sekarang dan Anda dapat memanfaatkan banyak hal baru yang tidak disediakan oleh teman lama kita! Lihat saja tutorial X DevAPI dan Anda akan melihatnya memiliki banyak fitur seksi baru yang bisa berguna. Anda hanya perlu membayar harga kurva belajar, yang diharapkan disertai dengan peningkatan teknologi apa pun. :)

PS. Sayangnya, Paket XDevAPI ini belum memiliki definisi jenis (dapat dimengerti oleh TypeScript), jadi jika Anda menggunakan naskah , Anda akan mengalami masalah. Saya mencoba menghasilkan .d.ts menggunakan dts-gendandtsmake , tetapi tidak berhasil. Jadi ingatlah itu.

Bersulang!

Aidin
sumber
3
Terima kasih telah mengirimkan jawaban terperinci untuk pertanyaan berumur setahun. :]
Daksh Gargas
3
bagus, jawaban yang benar-benar menjelaskan mysql_native_password alih-alih hanya menyuruh Anda melakukannya
wizloc
1
Ya, penjelasan yang tepat untuk sekali. Bagus untukmu, Aidin. Bagaimana saya ingin menghubungkan aplikasi tidak secara otomatis mengkonfigurasi port 3306 ke MySQL. Kami memiliki cukup banyak masalah untuk menentukan harga MySQL dan MariaDB dari 3306.
Trunk
Hati-hati dengan plugin Oracle, Anda mungkin mendapat penalti besar: theregister.co.uk/2019/10/04/oracle_virtualbox_merula
Juha Untinen
Ini adalah jawaban yang sangat bagus dan patut mendapat lebih banyak pujian!
Juni Wenston
82

Menggunakan mysql_native_passwordkarya - karya lama :

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;

Ini karena caching_sha2_passworddiperkenalkan di MySQL 8.0, tetapi versi Node.js belum diimplementasikan. Anda dapat melihat permintaan penarikan ini dan masalah ini untuk informasi lebih lanjut. Mungkin perbaikan akan segera hadir!

upupming
sumber
Bekerja seperti pesona. Apa yang lega!
topi
apa perbedaan antara menambahkan @localhost dan hanya 'root'
filemonczyk
Permintaan bekerja. Tetapi masih simpul tidak dapat terhubung ke server MySQL. Ada ide? Inilah kesalahannya, {"code": "ER_ACCESS_DENIED_ERROR", "errno": 1045, "sqlMessage": "Akses ditolak untuk 'root' @ 'localhost' pengguna (menggunakan kata sandi: YES)", "sqlState": "28000" , "fatal": true}
Sanjay Pradeep
26

Langkah Lengkap Untuk MySQL 8

Terhubung ke MySQL

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

Mereset password Anda

(Ganti your_new_passworddengan kata sandi yang ingin Anda gunakan)

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

Kemudian coba sambung menggunakan node

joshuakcockrell
sumber
@sky lihat jawaban saya di atas untuk detailnya.
Aidin
1
@Aidin Terima kasih, ini sangat membantu.
Langit
17

Meskipun jawaban yang diterima benar, saya lebih suka membuat pengguna baru dan kemudian menggunakan pengguna itu untuk mengakses 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';
Siddhant
sumber
2
Jika seseorang ingin menempuh rute ini, inilah artikel dengan beberapa penjelasan: digitalocean.com/community/tutorials/…
Devin
12

Jika Anda menemukan kesalahan ini tetapi masih ingin menggunakan MySQLversi 8. Anda dapat mencapai ini dengan memberi tahu Server MySQL untuk menggunakan plugin autentikasi lawas saat Anda membuat basis data menggunakan Docker.

Jadi, composefile Anda akan terlihat seperti ini:

# 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
Kaya
sumber
Saya menggunakan ini command, tetapi masih mendapatkan pesan kesalahan otentikasi yang tidak didukung ketika menggunakan mysqldi Node.js
Juha Untinen
Stacktrace lengkap ada di sini: pastebin.com/SzayQzdh dan buruh pelabuhan-compose.yml : pastebin.com/7pUrWYDs Kesalahan itu sendiri adalah:Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
Juha Untinen
1
@JuhaUntinen pastikan Anda menghapus wadah Docker (yang dibuat oleh docker-compose) dan volume (~ / Database / ORM_Test) dan kemudian jalankan 'docker-compose up' lagi. Kalau tidak, perubahan dari 'perintah' tidak akan diterapkan. Ini membantu dalam kasus saya.
Vitalii Ivanov
11

Dalam wadah buruh pelabuhan Mysql Terbaru

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

Jika baris perintah ALTER USER ... tidak berfungsi untuk Anda DAN jika Anda menggunakan Windows 10 maka cobalah untuk mengikuti langkah-langkah ini:

1) Ketik MySQL di bilah pencarian windows

2) Buka Penginstal MySQL Windows - Komunitas

3) Cari "server MySQL" dan klik Konfigurasi ulang langkah 3

4) Klik "Next" sampai Anda mencapai fase "Metode Otentikasi"

5) Pada fase "Metode Otentikasi" periksa opsi kedua "Gunakan Metode Otentikasi Legacy" langkah 5

6) Kemudian ikuti langkah-langkah yang diberikan oleh penginstal Windows hingga akhir

7) Setelah selesai, masuk ke "Layanan" dari bilah pencarian Windows, klik "mulai" MySql81 ".

Sekarang, coba lagi, koneksi antara MySQL dan Node.js akan berfungsi!

Campalo
sumber
4

Di MySQL 8.0, caching_sha2_passwordlebih tepatnya plugin otentikasi aslimysql_native_password. ...

Sebagian besar jawaban dalam pertanyaan ini menghasilkan penurunan peringkat ke mekanisme otentikasi dari caching_sha2_passwordmenjadimysql_native_password . Dari sudut pandang keamanan, ini cukup mengecewakan.

Dokumen ini secara luas membahas caching_sha2_passworddan tentu saja mengapa BUKAN merupakan pilihan pertama untuk menurunkan metode otentikasi.

Dengan itu, saya percaya jawaban Aidin harus menjadi jawaban yang diterima. Alih-alih menurunkan versi metode otentikasi, gunakan konektor yang cocok dengan versi server.

Lester
sumber
3

Dokumentasi asli dapat Anda temukan di sini: 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
sumber
Terlihat lebih rumit, tapi saya pikir kita harus mengikuti panduan resmi! b
Juneyoung Oh
3

Saya memiliki MYSQL di server dan aplikasi nodejs di server lain

Jalankan permintaan berikut di MYSQL Workbench

ALTER USER 'root' @ '%' DIIDENTIFIKASI DENGAN mysql_native_password DENGAN 'kata sandi'

iomar
sumber
2

Untuk menginstal mysql 8.0 pada Windows 10 mysql,

(1) luncurkan pemasang,

(2) klik "Konfigurasi ulang" di bawah QuickAction (di sebelah kiri MySQL Server), lalu

(3) klik di sebelah untuk melanjutkan melalui 2 layar berikutnya sampai tiba

(4) di "Metode Otentikasi", pilih "Gunakan Metode Otentikasi Legacy (Pertahankan kompatibilitas MySQL 5.x"

(5) Terus klik sampai instalasi selesai

Charles Goodwin
sumber
2

Dengan MySQL 8+, otentikasi standar baru caching_sha2_passwordbukan mysql_native_password. Metode otentikasi baru dan lebih aman belum didukung oleh mysqlpaket asli , tetapi Anda harus mempertimbangkan untuk menggunakan paket itu @mysql/xdevapi, yang secara resmi didukung dan dikelola oleh Oracle.

Untuk menginstal paket baru, jalankan:

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

Untuk terhubung ke database dan MASUKKAN beberapa NILAI:

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()
    });

Dokumentasi paket resmi dapat ditemukan di sini: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/

Penatua Druid
sumber
2

Jika Anda menggunakan buruh pelabuhan, itu berhasil untuk saya!

di docker-compose.ymltambahkan baris berikut:

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

setelah itu, downwadah dan uplagi.

Leo
sumber
1

Selain jawaban di atas; Setelah menjalankan perintah di bawah ini

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

Jika Anda mendapatkan kesalahan sebagai:

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

Kemudian coba di cmd sebagai admin; setel path ke folder bin server MySQL di cmd

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

dan kemudian jalankan perintah:

mysql_upgrade --force -uroot -p

Ini harus memperbarui server dan tabel sistem.

Maka Anda harus berhasil menjalankan perintah di bawah ini dalam Query di Workbench:

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

maka ingatlah untuk mengeksekusi perintah berikut:

flush privileges;

Setelah semua langkah ini harus berhasil terhubung ke database MySQL Anda. Semoga ini membantu...

Madhawa Jayagoda
sumber
0

Jalankan saja Pemasang Server MySQL dan Konfigurasikan ulang SQL Server Saya ... Ini berhasil bagi saya.

Alexander Burias
sumber
0

Periksa hak istimewa dan nama pengguna / kata sandi untuk pengguna MySQL Anda.

Untuk menangkap kesalahan, selalu bermanfaat untuk menggunakan yang ditimpa _delegateError metode yang . Dalam kasus Anda, ini harus terlihat seperti:

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

Konstruksi ini akan membantu Anda melacak kesalahan fatal.

B. Bohdan
sumber
0

Baru saja mengetahui hal ini setelah mencoba banyak hal. Apa yang akhirnya berhasil bagi saya adalah menambah file require('dotenv').config()saya .sequelizerc. Tampaknya sekuel-cli tidak membaca variabel env.

gbland777
sumber
0

Down Grading mungkin bukan opsi yang baik karena:

  1. Itu ditingkatkan karena suatu alasan (Untuk memberikan otentikasi yang lebih baik).
  2. Anda mungkin tidak memiliki cukup izin untuk melakukan perubahan tersebut.

Anda dapat menggunakan mysql2paket sebagai pengganti mysql. Sebagian besar API kompatibel dengan mysqljs. Juga, ia memiliki dukungan janji.

Gunakan seperti: const mysql = require('mysql2/promise')

Anda dapat membaca lebih lanjut tentang di mysql2sini: https://www.npmjs.com/package/mysql2

Semoga ini bisa membantu. :)

Salim Shamim
sumber
0

Anda dapat melewati ORM, pembangun, dll. Dan menyederhanakan manajemen DB / SQL Anda menggunakan sqlerdan 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');
});
jelek
sumber
-1

Saya memiliki masalah yang sama dengan MySQL dan saya pecahkan dengan menggunakan XAMPP untuk terhubung dengan MySQL dan menghentikan layanan di windows untuk MySQL (panel kontrol - Administrative Tools - Services), dan di folder db.js (yang bertanggung jawab untuk database) I buat kata sandi kosong (di sini Anda dapat melihat :)

const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: ''
});
Mohammad Jouza
sumber
tolong jangan tambahkan masalah yang Anda hadapi sebagai jawaban untuk masalah yang dihadapi
Aloy A Sen