php mysqli_connect: phương thức xác thực không xác định đối với ứng dụng khách [caching_sha2_password]


95

Tôi đang sử dụng php mysqli_connectđể đăng nhập vào cơ sở dữ liệu MySQL (tất cả trên 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');    
}
?>

đây là bảng mysql.user: bảng mysql.user

Tệp ini MySQL Server:

[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

với caching_sha2_passwordtrong tệp ini MySQL Server, hoàn toàn không thể đăng nhập bằng user1 hoặc user2;

error: mysqli_connect (): Máy chủ đã yêu cầu phương thức xác thực không xác định đối với máy khách [caching_sha2_password] trong ...

với mysql_native_passwordtrong tệp ini MySQL Server, có thể đăng nhập với user1, nhưng với user2, cùng một lỗi;


làm cách nào để đăng nhập bằng caching_sha2_passwordmySql Server?


PDO có hỗ trợ điều này không? Tôi đã xem các báo cáo khác về mysqli.
tadman

Câu trả lời được đăng bởi @ 黃皓哲 phải được đánh dấu là câu trả lời được chấp nhận.
FIL

Câu trả lời:


53

Kể từ PHP 7.4, đây không còn là vấn đề nữa. Hỗ trợ cho caching_sha2phương pháp xác thực đã được thêm vào mysqlnd.


Hiện tại, tiện ích mở rộng mysqli PHP không hỗ trợ tính năng xác thực caching_sha2 mới. Bạn phải đợi cho đến khi họ phát hành bản cập nhật.

Kiểm tra bài đăng liên quan từ các nhà phát triển MySQL: https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

Họ không đề cập đến PDO, có lẽ bạn nên thử kết nối với PDO.



@Machavity bạn có biết câu trả lời này còn giá trị không? I E. nó vẫn chưa lỗi thời với các phiên bản PHP mới hơn?
gen

@gen Dựa trên lỗi này , có vẻ như nó đang hoạt động kể từ ngày 7.4.2
Machavity

3
Nâng cấp lên php7.4 không giải quyết được vấn đề. Và tôi nghĩ rằng đó là cách tiếp cận tốt nhất thay vì thay đổi phương thức xác thực mysql_native_passwordnhư được đề xuất bởi một số câu trả lời.
ultrasamad

Tôi sử dụng docker (apache + php trong một vùng chứa và mysql trong vùng chứa khác) và điều này đã giải quyết được Vấn đề của tôi. Cảm ơn!
Joan Galmés Riera

228

Tôi giải quyết điều này bằng lệnh SQL:

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

được tham chiếu bởi https://dev.mysql.com/doc/refman/8.0/en/alter-user.html

nếu bạn đang tạo người dùng mới

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

được tham chiếu bởi https://dev.mysql.com/doc/refman/8.0/en/create-user.html

cái này phù hợp với tôi


3
Câu trả lời tốt. Bí quyết ở đây là bạn có thể phải làm điều này mỗi khi bạn thêm người dùng mới, tùy thuộc vào cài đặt máy chủ
Machavity

3
Thank you very much tôi đang tìm kiếm một cách để chuyển đổi băm mật khẩu mới để những người lớn tuổi (như định dạng user2 sang định dạng user1 trong câu hỏi) và câu trả lời của bạn đã làm chính xác công việc
Kế toán م

10
Và như vậy đã kết thúc cuộc đấu tranh 4 ngày để có được php-7.2.9 / 11 chơi tốt với MySQL-8.012. Ai đó trong nhóm PHP có thể bị thuyết phục lưu ý điều này trong CÀI ĐẶT trong tarball không? Nó sẽ tiết kiệm hàng nghìn giờ cho người trong một hoặc hai năm tới.
MountainMan

4
@MountainMan Đã cứu cuộc đời tôi
Đuổi theo

8
điều này nên được câu trả lời được chấp nhận cho giải pháp workaround
Yohanes AI

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

Xóa dấu ngoặc kép (') sau ALTER USERvà giữ dấu ngoặc kép (') saumysql_native_password BY

Nó cũng đang làm việc cho tôi.


2
Đó là giải pháp duy nhất phù hợp với tôi trên máy chủ localhost sử dụng máy chủ WAMP :)
Jodyshop

Điều này dường như đã khắc phục được nó trên thiết lập LAMP homebrew trên máy Mac của tôi. Tuy nhiên, không gặp sự cố này trên debian.
Magnus

22

Nếu bạn đang sử dụng Windows và hoàn toàn không thể sử dụng caching_sha2_password, bạn có thể làm như sau:

  1. chạy lại MySQL Installer
  2. chọn "Cấu hình lại" bên cạnh Máy chủ MySQL (mục trên cùng)
  3. nhấp vào "Tiếp theo" cho đến khi bạn đến "Phương thức xác thực"
  4. thay đổi "Sử dụng mã hóa mật khẩu mạnh để xác thực (KHUYẾN CÁO)" thành "Sử dụng phương pháp xác thực kế thừa (Duy trì khả năng tương thích MySQL 5.X)
  5. Bấm tiếp"
  6. nhập Mật khẩu tài khoản gốc của bạn trong Tài khoản và Vai trò, rồi nhấp vào "Kiểm tra"
  7. Bấm tiếp"
  8. tiếp tục nhấp vào "Tiếp theo" cho đến khi bạn đến "Áp dụng cấu hình"
  9. nhấp vào "Thực thi"

Trình cài đặt sẽ thực hiện tất cả các thay đổi cấu hình cần thiết cho bạn.


người đàn ông sau một năm ủng hộ câu trả lời này db của tôi đã bị tấn công ...
Code Tree

11

Nó làm việc cho tôi (PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64bits)

Chỉnh sửa tệp C:\ProgramData\MySQL\MySQL Server 8.0\my.ini:

default_authentication_plugin=mysql_native_password

Đặt lại dịch vụ MySQL trên Windows và trong MySQL Shell ...

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';

nó hoạt động, cảm ơn bạn ... chúng tôi phải định cấu hình 2 thứ: mysql conf và alter người dùng
danisupr4

9

Giống như nhiều người, tôi đã gặp phải vấn đề tương tự. Mặc dù người dùng được thiết lập để sử dụng mysql_native_password và tôi có thể kết nối từ dòng lệnh, nhưng cách duy nhất tôi có thể khiến mysqli () kết nối là thêm

default-verify-plugin = mysql_native_password

vào phần [mysqld] của, trong thiết lập của tôi trên ubuntu 19.10, /etc/mysql/mysql.conf.d/mysqld.cnf


2
Ngoài ra, hãy nhớ nếu người dùng được tạo trước khi thay đổi này, nó sẽ không hoạt động. Vì vậy, ĐẦU TIÊN bạn nên đặt xác thực mặc định trong cấu hình và hơn là tạo người dùng để hoạt động!
Oleg Popov

4

Tôi đã chạy lệnh sau ALTER USER 'root' @ 'localhost' identified with mysql_native_password BY 'root123';trong dòng lệnh và cuối cùng khởi động lại MySQL trong các dịch vụ cục bộ.


không có dấu cách nào ở đây 'root' @ 'localhost'nên được đọc thay thếALTER USER 'root'@'localhost' identified with mysql_native_password BY 'root123';
d1jhoni1b

4

Bây giờ bạn có thể nâng cấp lên PHP7.4 và MySQL sẽ đi kèm caching_sha2_passwordtheo mặc định, vì vậy cài đặt MySQL mặc định sẽ hoạt động với mysqli_connectKhông yêu cầu cấu hình.


2
Không hẳn. Nó có lỗi trong 7.4.0 và 7.4.1. Đã sửa trong 7.4.2
Machavity

3

Nếu bạn đang sử dụng máy Mac, đây là cách khắc phục. Đây là sau hàng tấn thử và sai. Hy vọng điều này sẽ giúp những người khác ..

Gỡ lỗi:

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

$ which mysql
/usr/local/bin/mysql

Độ phân giải: nano /usr/local/etc/my.cnf

Thêm: default-verify-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
------

Cuối cùng Run: dịch vụ bia khởi động lại mysql


Cần cái này ... Cảm ơn!
nykc

1

Tôi đã thử điều này trong Ubuntu 18.04 và là giải pháp duy nhất phù hợp với tôi:

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';

-4

Tôi nghĩ sẽ không hữu ích khi định cấu hình máy chủ mysql mà không mã hóa caching_sha2_password, chúng tôi phải tìm cách xuất bản, gửi hoặc lấy thông tin an toàn thông qua mạng. Như bạn thấy trong đoạn mã bên dưới, tôi không sử dụng biến $ db_name và tôi đang sử dụng một người dùng trong máy chủ mysql với mật khẩu cấu hình độc lập. Chỉ cần tạo mật khẩu người dùng Standar và định cấu hình tất cả các mật khẩu. nó hoạt động, nhưng làm thế nào tôi đã nói mà không có sự an toàn.

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

?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.