Baru-baru ini saya sedang mengerjakan Node. aplikasi js. Dalam aplikasi saya, saya menghadapi masalah koneksi dengan server MySQL. Semuanya baik-baik saja, saya masih mendapatkan kesalahan berikut
Kesalahan. ER_NOT_SUPPORTED_AUTH_MODE. Klien tidak mendukung protokol autentikasi yang diminta oleh server;
Pada artikel ini, saya akan menunjukkan kepada Anda mengapa kesalahan ini terjadi dan bagaimana cara mengatasi kesalahan ini
Saat melalui Googling masalah ini, saya mengetahui bahwa MySQL 8. 0 menggunakan plugin otentikasi caching_sha2_password
_ daripada mysql_native_password
dan Node. Paket js Mysql menggunakan mysql_native_password
plugin autentikasi
Larutan
Dalam situasi ini, Anda dapat mengubah kata sandi pengguna saat ini sesuai dengan plugin otentikasi mysql_native_password
atau Anda perlu membuat pengguna baru dengan plugin otentikasi mysql_native_password
Ubah kata sandi pengguna saat ini menjadi plugin otentikasi
Untuk mengubah kata sandi pengguna saat ini menjadi plugin otentikasi mysql_native_password
_, Anda harus masuk ke baris perintah MySQL dan menjalankan perintah berikut. Perhatikan bahwa
FLUSH PRIVILEGES;
4 adalah nama pengguna dan FLUSH PRIVILEGES;
5 adalah kata sandi untuk pengguna tersebutALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Jangan lupa untuk menyiram hak istimewa
FLUSH PRIVILEGES;
Dan itu saja, logout ke baris perintah MySQL
quit;
_Tambahkan pengguna baru dengan plugin autentikasi mysql_native_password
Untuk membuat pengguna baru, login ke baris perintah MySQL dan jalankan perintah berikut dengan nama pengguna dan kata sandi
CREATE USER 'newuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Anda mungkin perlu memberikan hak istimewa kepada pengguna baru. Jika Anda ingin memberikan semua hak istimewa, jalankan kueri berikut
Saya mulai mengerjakan artikel ini setelah saya memecahkan masalah menghubungkan aplikasi ekspres saya ke server MySQL lokal saya. Saya mendapat pesan kesalahan di bawah ini pada upaya pertama saya untuk terhubung ke database MySql lokal
Kesalahan. ER_NOT_SUPPORTED_AUTH_MODE. Klien tidak mendukung protokol autentikasi yang diminta oleh server;
Versi MySQL dari 4. 1x ke atas menggunakan algoritme yang berbeda untuk mem-hash kata sandi dari sebelumnya 4. 1 versi. Jika klien Anda tidak menerapkan algoritme ini, kemungkinan Anda akan mendapatkan kesalahan ini saat mencoba terhubung
Larutan
Ada dua opsi yang tersedia untuk Anda;
- Ubah kata sandi pengguna saat ini untuk menggunakan algoritme lama
- Buat pengguna baru, atur kata sandi dengan algoritme hashing lama, dan atur hak istimewa
Ubah Kata Sandi Pengguna Saat Ini
Di shell MySQL Anda, ketikkan perintah di bawah ini dengan memasukkan nama pengguna Anda [root atau pengguna saat ini] sebagai pengganti pengguna, dan kata sandi. Jangan hapus tanda kutip
mysql> ALTER USER ‘user’@’localhost’ IDENTIFIED WITH mysql_native_password by ‘password’;
Setelah ini, Anda dapat menggunakan kata sandi baru untuk terhubung
Buat Pengguna Baru
Jika Anda seperti saya dan tidak ingin memiliki dua pengguna dengan hak penuh, ini untuk Anda
Kita mulai dengan membuat user baru di dalam shell MySQL
mysql> CREATE USER ‘newuser'@'localhost' IDENTIFIED BY ‘password';
Sekarang kami memiliki pengguna baru, tetapi pengguna tersebut tidak berguna saat ini karena tidak memiliki izin. Jika Anda keluar dari shell dan mencoba masuk dengan kredensial, Anda akan ditolak
Selanjutnya, kami memberi pengguna beberapa hak istimewa
Untuk hak istimewa penuh
mysql> GRANT ALL PRIVILEGES ON *.* TO ‘newuser’@'localhost';
Tanda bintang masing-masing mewakili database dan tabel yang boleh diakses oleh pengguna. Tinggalkan tanda bintang jika Anda ingin pengguna memiliki akses ke semua database dan tabel
MySQL 8 telah mendukung metode autentikasi pluggable. Secara default, salah satunya bernama caching_sha2_password
digunakan daripada mysql_native_password
lama kita yang baik [sumber]. Sudah jelas bahwa menggunakan algoritma crypto dengan beberapa jabat tangan lebih aman daripada lewat kata sandi biasa yang telah ada selama 24 tahun
Sekarang, masalahnya adalah
npm un mysql && npm i mysql2
_0 di Node [paket yang Anda instal dengan npm un mysql && npm i mysql2
1 dan menggunakannya dalam kode Node Anda] belum mendukung metode autentikasi default baru MySQL 8 ini. Masalahnya ada di sini. https. //github. com/mysqljs/mysql/issues/1507 dan masih terbuka, setelah 3 tahun, per Juli 2019UPDATE Juni 2019. Ada PR baru di mysqljs sekarang untuk memperbaikinya
UPDATE Februari 2020. Rupanya itu
UPDATE Juli 2020. Tampaknya masih belum masuk [setidaknya pada April 2020], tetapi node-mysql2 mendukung permintaan sakelar Otentikasi. Beri komentar di bawah jika
npm un mysql && npm i mysql2
_2 berfungsi dengan baik untuk masalah ini -- saya akan mengujinya sendiri nantiPEMBARUAN April 2021. Sepertinya masalahnya masih ada dan baru 3 hari yang lalu, dan berhasil di sana -- belum resmi di mysql. paket js. Juga, sesuai komentar di bawah, sepertinya paket mysql2 berfungsi dengan baik dan mendukung Authentication-switch dengan benar
Opsi 1] [TIDAK DIREKOMENDASIKAN] Turunkan versi "MySQL" untuk mengautentikasi menggunakan "mysql_native_password" lama yang baik
Itulah yang disarankan semua orang di sini [mis. g. jawaban teratas di atas]. Anda baru saja masuk ke mysql
dan menjalankan kueri yang mengatakan
npm un mysql && npm i mysql2
4 baik-baik saja menggunakan metode mysql_native_password
lama untuk otentikasiALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...
Hal baiknya adalah, hidup akan menjadi sederhana dan Anda masih dapat menggunakan alat lama yang bagus seperti Sequel Pro tanpa masalah. Tetapi masalahnya adalah, Anda tidak memanfaatkan barang yang lebih aman [dan keren, baca di bawah] yang tersedia untuk Anda
Opsi 2] [Meh. ] Ganti paket "Node" dengan MySQL Connecter X DevAPI
MySQL X DevAPI for Node adalah pengganti paket Mysqljs Node, yang disediakan oleh http. //dev. mysql. com resmi guys
Ini berfungsi seperti pesona yang mendukung otentikasi caching_sha2_password
. [Pastikan Anda menggunakan port
npm un mysql && npm i mysql2
_7 untuk komunikasi Protokol X. ]Hal buruknya adalah, Anda telah meninggalkan paket mysql
lama kami yang sudah biasa dan diandalkan semua orang
Hal baiknya adalah, aplikasi Anda sekarang lebih aman dan Anda dapat memanfaatkan banyak hal baru yang tidak disediakan oleh teman lama kita yang baik. Lihat saja tutorial X DevAPI dan Anda akan melihatnya memiliki banyak fitur seksi baru yang berguna. Anda hanya perlu membayar harga kurva pembelajaran, yang diharapkan hadir dengan peningkatan teknologi apa pun. . ]
PS. Sayangnya, Paket XDevAPI ini belum memiliki definisi tipe [dapat dimengerti oleh TypeScript], jadi jika Anda menggunakan TypeScript, Anda akan mengalami masalah. Saya mencoba untuk menghasilkan. d. ts menggunakan
npm un mysql && npm i mysql2
9 dan ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
0, tetapi tidak berhasil. Jadi ingatlah ituOpsi 3] [DISARANKAN] Ganti "mysql. js" dengan "mysql2.js". js" paket
Seperti disebutkan di atas, paket mysql [tautan paket NPM] masih mengalami masalah ini [per April 2021]. Tetapi paket mysql2 [tautan paket NPM] tidak. Jadi mungkin yang berikut ini harus menjadi jawaban satu kalimat
npm un mysql && npm i mysql2
_Harap diperhatikan bahwa mysql2
adalah pekerjaan bercabang dari mysql
yang populer, tetapi popularitasnya [620K unduhan per minggu untuk mysql2
pada April 2020] telah mendekati paket aslinya [720K unduhan per minggu untuk mysql
pada April 2021] yang beralih