php mysqli_connect: metode otentikasi tidak dikenal oleh klien [caching_sha2_password]

95

Saya menggunakan php mysqli_connectuntuk login ke database MySQL (semua di localhost)

<?php
//DEFINE ('DB_USER', 'user2');
//DEFINE ('DB_PASSWORD', 'pass2');
DEFINE ('DB_USER', 'user1');
DEFINE ('DB_PASSWORD', 'pass1');
DEFINE ('DB_HOST', '127.0.0.1');
DEFINE ('DB_NAME', 'dbname');

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if(!$dbc){
    die('error connecting to database');    
}
?>

ini adalah tabel mysql.user: tabel mysql.user

File ini Server MySQL:

[mysqld]
# The default authentication plugin to be used when connecting to the server
default_authentication_plugin=caching_sha2_password
#default_authentication_plugin=mysql_native_password

dengan caching_sha2_passworddi file ini Server MySQL, sama sekali tidak mungkin untuk login dengan user1 atau user2;

error: mysqli_connect (): Server meminta metode otentikasi yang tidak diketahui klien [caching_sha2_password] di ...

dengan mysql_native_passworddi file MySQL Server ini, dimungkinkan untuk login dengan user1, tetapi dengan user2, kesalahan yang sama;


bagaimana saya bisa login menggunakan caching_sha2_passworddi mySql Server?

Guti_Haz
sumber
Apakah PDO mendukung ini? Saya telah melihat laporan lain tentang mysqli.
tadman
Jawaban yang diposting oleh @ 黃皓哲 harus ditandai sebagai jawaban yang diterima.
FIL

Jawaban:

53

Mulai PHP 7.4, ini tidak lagi menjadi masalah. Dukungan untuk caching_sha2metode otentikasi telah ditambahkan ke mysqlnd.


Saat ini, ekstensi PHP mysqli tidak mendukung fitur otentikasi caching_sha2 yang baru. Anda harus menunggu sampai mereka merilis pembaruan.

Periksa posting terkait dari pengembang MySQL: https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

Mereka tidak menyebutkan PDO, mungkin Anda harus mencoba menghubungkan dengan PDO.

abeyaz
sumber
3
PDO memiliki masalah yang sama
Machavity
@Machavity apa kamu tahu kalau jawaban ini masih valid? Yaitu. itu belum usang dengan versi PHP yang lebih baru?
gen
@gen Berdasarkan bug ini , sepertinya berfungsi pada 7.4.2
Machavity
3
Mengupgrade ke php7.4 memang menyelesaikan masalah. Dan saya pikir itu adalah pendekatan terbaik daripada mengubah metode otentikasi mysql_native_passwordseperti yang disarankan oleh beberapa jawaban.
ultrasamad
Saya menggunakan buruh pelabuhan (apache + php dalam wadah dan mysql di wadah lain) dan ini memecahkan Masalah saya. Terima kasih!
Joan Galmés Riera
227

Saya menyelesaikan ini dengan perintah SQL:

ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

yang dirujuk oleh https://dev.mysql.com/doc/refman/8.0/en/alter-user.html

jika Anda membuat pengguna baru

 CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

yang dirujuk oleh https://dev.mysql.com/doc/refman/8.0/en/create-user.html

ini berhasil untuk saya

黃皓哲
sumber
3
Jawaban yang bagus. Gotcha di sini adalah Anda mungkin harus melakukan ini setiap kali Anda menambahkan pengguna baru, tergantung pada pengaturan server
Machavity
3
Terima kasih banyak Saya sedang mencari cara untuk mengonversi hash kata sandi baru ke yang lebih lama (seperti format pengguna2 ke format pengguna1 dalam pertanyaan) dan jawaban Anda benar-benar
berfungsi
10
Dan mengakhiri perjuangan 4 hari untuk mendapatkan php-7.2.9 / 11 bermain bagus dengan MySQL-8.012. Bisakah seseorang di tim PHP diyakinkan untuk mencatat ini di INSTALL di tarball? Ini akan menghemat ribuan jam orang selama satu atau dua tahun ke depan.
MountainMan
4
@MountainMan Menyelamatkan hidup saya
Mengejar
8
ini harus menjadi jawaban yang diterima untuk solusi solusi
Yohanes AI
27
ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

Hapus tanda kutip (') setelahnya ALTER USERdan pertahankan tanda kutip (') setelahnyamysql_native_password BY

Ini bekerja untuk saya juga.

Eranda J.
sumber
2
Itu adalah satu-satunya solusi yang berfungsi untuk saya di server localhost menggunakan server WAMP :)
Jodyshop
Ini sepertinya memperbaikinya pada pengaturan LAMP homebrew Mac saya. Tidak mengalami masalah ini di debian.
Magnus
22

Jika Anda menggunakan Windows dan tidak dapat digunakan caching_sha2_passwordsama sekali, Anda dapat melakukan hal berikut:

  1. jalankan kembali Pemasang MySQL
  2. pilih "Konfigurasi ulang" di sebelah Server MySQL (item teratas)
  3. klik "Berikutnya" sampai Anda mendapatkan "Metode Otentikasi"
  4. ubah "Gunakan Enkripsi Kata Sandi Kuat untuk Otentikasi (DIREKOMENDASIKAN)" menjadi "Gunakan Metode Otentikasi Lama (Pertahankan Kompatibilitas MySQL 5.X)
  5. klik "Selanjutnya"
  6. masukkan Kata Sandi Akun Root Anda di Akun dan Peran, dan klik "Periksa"
  7. klik "Selanjutnya"
  8. terus klik "Next" sampai Anda mendapatkan "Apply Configuration"
  9. klik "Jalankan"

Installer akan membuat semua perubahan konfigurasi yang diperlukan untuk Anda.

CJ Dennis
sumber
man setelah setahun upvoting jawaban ini db saya diretas ...
Code Tree
11

Ini berfungsi untuk saya (PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64bits)

Edit file C:\ProgramData\MySQL\MySQL Server 8.0\my.ini:

default_authentication_plugin=mysql_native_password

Setel ulang layanan MySQL di Windows, dan di MySQL Shell ...

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
Chinnon Santos
sumber
berhasil, terima kasih ... kita harus
mengkonfigurasi
9

Seperti banyak orang lainnya, saya memiliki masalah yang sama. Meskipun pengguna diatur untuk menggunakan mysql_native_password, dan saya dapat menyambung dari baris perintah, satu-satunya cara agar saya dapat menghubungkan mysqli () adalah dengan menambahkan

default-authentication-plugin = mysql_native_password

ke bagian [mysqld] dari, dalam pengaturan saya di ubuntu 19.10, /etc/mysql/mysql.conf.d/mysqld.cnf

dBags
sumber
2
Juga, perlu diingat jika pengguna dibuat sebelum perubahan ini, itu tidak akan berfungsi. Jadi, Anda harus PERTAMA menetapkan otentikasi-default dalam konfigurasi dan daripada membuat pengguna agar dapat bekerja!
Oleg Popov
4

Saya menjalankan perintah berikut ALTER USER 'root' @ 'localhost' identified with mysql_native_password BY 'root123';di baris perintah dan akhirnya memulai ulang MySQL di layanan lokal.

JRonald Moreno
sumber
tidak ada spasi di sini yang 'root' @ 'localhost'harus dibacaALTER USER 'root'@'localhost' identified with mysql_native_password BY 'root123';
d1jhoni1b
4

Sekarang Anda dapat memutakhirkan ke PHP7.4 dan MySQL akan digunakan caching_sha2_passwordsecara default, jadi instalasi MySQL default akan berfungsi tanpa mysqli_connectkonfigurasi yang diperlukan.

Pavel Niedoba
sumber
2
Tidak terlalu. Ini buggy di 7.4.0 dan 7.4.1. Diperbaiki di 7.4.2
Machavity
3

Jika Anda menggunakan Mac, berikut cara memperbaikinya. Ini setelah banyak trial and error. Semoga ini bisa membantu orang lain ..

Debugging:

$mysql --verbose --help | grep my.cnf

$ which mysql
/usr/local/bin/mysql

Resolusi: nano /usr/local/etc/my.cnf

Tambahkan: default-authentication-plugin = mysql_native_password

-------
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
default-authentication-plugin=mysql_native_password
------

Akhirnya Jalankan: layanan brew restart mysql

kp123
sumber
Membutuhkan ini ... Terima kasih!
nykc
1

Saya mencoba ini di Ubuntu 18.04 dan merupakan satu-satunya solusi yang berhasil untuk saya:

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
imjesr
sumber
-4

Saya pikir tidak berguna untuk mengkonfigurasi server mysql tanpa enkripsi caching_sha2_password, kita harus menemukan cara untuk mempublikasikan, mengirim atau mendapatkan informasi yang aman melalui jaringan. Seperti yang Anda lihat pada kode di bawah ini, saya tidak menggunakan variabel $ db_name, dan saya menggunakan pengguna di server mysql dengan sandi konfigurasi standar. Cukup buat kata sandi pengguna Standar dan konfigurasikan semua hak istimewa. itu berhasil, tetapi bagaimana saya mengatakan tanpa seguritas.

<?php
$db_name="db";
$mysql_username="root";
$mysql_password="****";
$server_name="localhost";
$conn=mysqli_connect($server_name,$mysql_username,$mysql_password);

if ($conn) {
    echo "connetion success";
}
else{
    echo mysqli_error($conn);
}

?>
Steven Canales
sumber