php mysqli_connect: प्रमाणीकरण विधि ग्राहक के लिए अज्ञात है [caching_sha2_password]


101

मैं mysqli_connectएक MySQL डेटाबेस में प्रवेश के लिए php का उपयोग कर रहा हूं (सभी स्थानीयहोस्ट पर)

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

यह mysql.user तालिका है: mysql.user तालिका

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

साथ caching_sha2_passwordMySQL सर्वर INI फ़ाइल में, यह सब पर user1 या user2 के साथ प्रवेश करना संभव नहीं है;

त्रुटि: mysqli_connect (): सर्वर ने क्लाइंट के लिए अज्ञात तरीके से प्रमाणीकरण विधि का अनुरोध किया [caching_sha2_pass] में ...

साथ mysql_native_passwordMySQL सर्वर INI फ़ाइल में, यह user1 के साथ लॉगिन करने के लिए संभव है, लेकिन user2, एक ही त्रुटि के साथ;


मैं caching_sha2_passwordmySql सर्वर पर कैसे लॉगिन कर सकता हूं ?


क्या पीडीओ इसका समर्थन करता है? मैंने अन्य रिपोर्टों के बारे में देखा है mysqli
tadman

@ द्वारा पोस्ट किए गए उत्तर को स्वीकृत उत्तर के रूप में चिह्नित किया जाना चाहिए।
FIL

जवाबों:


56

PHP 7.4 के रूप में, यह अब एक मुद्दा नहीं है। caching_sha2प्रमाणीकरण विधि के लिए समर्थन mysqlnd में जोड़ा गया है।


वर्तमान में, PHP mysqli एक्सटेंशन नए caching_sha2 प्रमाणीकरण सुविधा का समर्थन नहीं करता है। आपको अपडेट जारी करने तक इंतजार करना होगा।

MySQL डेवलपर्स से संबंधित पोस्ट की जाँच करें: https://mysqlserverteam.com/upmission-to-mysql-8-0-default-authentication-plugin-considerations/

उन्होंने पीडीओ का उल्लेख नहीं किया, शायद आपको पीडीओ से जुड़ने की कोशिश करनी चाहिए।



@Machvity क्या आप जानते हैं कि क्या यह उत्तर अभी भी मान्य है? अर्थात। यह नए PHP संस्करणों के साथ अभी तक पुराना नहीं है?
जनरल

के आधार पर @gen इस बग , ऐसा लग रहा है 7.4.2 के रूप में काम कर रहा है
Machavity

3
Php7.4 में अपग्रेड करने से समस्या हल हो जाती है। और मुझे लगता है कि mysql_native_passwordकुछ उत्तरों द्वारा सुझाए अनुसार प्रमाणीकरण पद्धति को बदलने के बजाय यह सबसे अच्छा तरीका है।
अल्ट्रासांउड

मैं एक कंटेनर में docker (Apache + php और अन्य कंटेनर में mysql) का उपयोग करता हूं और इससे मेरी समस्या हल हो गई। धन्यवाद!
जोआन गेलमेस रीएरा

235

मैं इसे SQL कमांड द्वारा हल करता हूं:

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

जो कि https://dev.mysql.com/doc/refman/8.0/en/alter-user.html द्वारा संदर्भित है

यदि आप नया उपयोगकर्ता बना रहे हैं

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

जो https://dev.mysql.com/doc/refman/8.0/en/create-user.html द्वारा संदर्भित है

यह मेरे लिए काम करता है


3
अच्छा उत्तर। पकड़ लिया यहाँ आप सर्वर सेटिंग्स के आधार पर, इस हर बार जब आप एक नया उपयोगकर्ता जोड़ने क्या करना है हो सकता है
Machavity

3
बहुत बहुत धन्यवाद मैं नए पासवर्ड हैश को पुराने लोगों में बदलने के लिए एक रास्ता ढूंढ रहा था (जैसे प्रश्न में user1 प्रारूप के लिए user2 प्रारूप) और आपके उत्तर ने बिल्कुल काम किया
लेखाकार م

10
और इसलिए MySQL-8.012 के साथ अच्छा खेलना php-7.2.9 / 11 पाने के लिए 4 दिन का संघर्ष समाप्त हुआ। क्या PHP टीम के किसी व्यक्ति को टैरबॉल में INSTALL में इस पर ध्यान दिया जा सकता है? यह अगले या दो साल में हजारों लोगों के घंटे बचाता है।
MountainMan

4
@ मोंटमैन ने मेरे जीवन को बचा लिया
चेस

8
इसे समाधान समाधान के लिए स्वीकार किया जाना चाहिए
योहन एआई

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

उद्धरण (') के बाद निकालें ALTER USERऔर (') के बाद उद्धरण रखेंmysql_native_password BY

यह मेरे लिए भी काम कर रहा है।


2
WAMP सर्वर का उपयोग करके लोकलहोस्ट सर्वर पर मेरे लिए यही एकमात्र समाधान काम कर रहा था :)
जोडीशोप

यह मेरे मैक के homebrew दीपक सेटअप पर इसे ठीक करने के लिए लग रहा था। हालांकि डेबियन पर इस समस्या का अनुभव नहीं किया।
मैग्नस

23

यदि आप विंडोज पर हैं और इसका उपयोग करना संभव नहीं है caching_sha2_password, तो आप निम्न कार्य कर सकते हैं:

  1. MySQL इंस्टालर को फिर से चलाएँ
  2. MySQL सर्वर (शीर्ष आइटम) के आगे "पुन: कॉन्फ़िगर करें" चुनें
  3. "प्रमाणीकरण" प्राप्त करने तक "अगला" पर क्लिक करें
  4. "ऑथेंटिकेशन ऑथेंटिकेशन के लिए स्ट्रॉन्ग पासवर्ड एनक्रिप्शन का उपयोग करें" (लिगेसी ऑथेंटिकेशन मेथड का उपयोग करें)
  5. अगला पर क्लिक करें"
  6. खातों और रोल्स में अपना रूट खाता पासवर्ड दर्ज करें, और "चेक" पर क्लिक करें
  7. अगला पर क्लिक करें"
  8. "अगला" पर क्लिक करें जब तक आपको "कॉन्फ़िगरेशन लागू न करें"
  9. "निष्पादित करें" पर क्लिक करें

इंस्टॉलर आपके लिए आवश्यक सभी कॉन्फ़िगरेशन परिवर्तन कर देगा।


एक साल के बाद आदमी इस जवाब को मेरी डीबी हैक किया गया था ...
कोड ट्री

12

यह मेरे लिए काम कर रहा है (PHP 5.6 + PDO / MySQL सर्वर 8.0 / विंडोज 7 64 बिट्स)

फ़ाइल संपादित करें C:\ProgramData\MySQL\MySQL Server 8.0\my.ini:

default_authentication_plugin=mysql_native_password

Windows पर MySQL सेवा रीसेट करें, और MySQL शेल में ...

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

यह काम करता है, धन्यवाद ... हमें उस 2 चीजों को कॉन्फ़िगर करना चाहिए: mysql conf और उपयोगकर्ता को बदल दें
danisupr4

9

कई लोगों की तरह, मुझे भी यही समस्या हुई है। हालाँकि उपयोगकर्ता mysql_native_password का उपयोग करने के लिए तैयार है, और मैं कमांड लाइन से कनेक्ट कर सकता हूं, जिस तरह से मैं mysqli () कनेक्ट करने के लिए मिल सकता है

डिफ़ॉल्ट प्रमाणीकरण-प्लगइन = mysql_native_password

[mysqld] के अनुभाग में, ubuntu 19.10, /etc/mysql/mysql.conf.d/mysqld.cnf पर मेरे सेटअप में


2
इसके अलावा, ध्यान रखें कि यदि उपयोगकर्ता इस परिवर्तन से पहले बना है तो यह काम नहीं करेगा। तो, आपको कॉन्फ़िगर करना चाहिए डिफ़ॉल्ट रूप से डिफ़ॉल्ट में प्रमाणीकरण और काम करने के लिए उपयोगकर्ता को बनाने से!
ओलेग पोपोव

4

मैंने ALTER USER 'root' @ 'localhost' identified with mysql_native_password BY 'root123';कमांड लाइन में निम्न कमांड को चलाया और अंत में स्थानीय सेवाओं में MySQL पुनः आरंभ करें।


यहाँ कोई स्थान नहीं 'root' @ 'localhost'पढ़ा जाना चाहिएALTER USER 'root'@'localhost' identified with mysql_native_password BY 'root123';
d1jhoni1b

4

अब आप PHP7.4 में अपग्रेड कर सकते हैं और MySQL caching_sha2_passwordडिफ़ॉल्ट रूप से जाएगा, इसलिए डिफ़ॉल्ट MySQL इंस्टॉलेशन mysqli_connectआवश्यक कॉन्फ़िगरेशन के साथ काम नहीं करेगा ।


2
काफी नहीं। यह 7.4.0 और 7.4.1 में छोटी गाड़ी है। में 7.4.2 फिक्स्ड
Machavity

3

यदि आप एक मैक पर हैं, तो इसे कैसे ठीक करें। यह परीक्षण और त्रुटि के टन के बाद है। आशा है कि यह दूसरों की मदद करता है ..

डिबगिंग:

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

$ which mysql
/usr/local/bin/mysql

संकल्प: नैनो /usr/local/etc/my.cnf

जोड़ें: डिफ़ॉल्ट-प्रमाणीकरण-प्लगइन = 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
------

अंत में चलाएं: काढ़ा सेवा फिर से शुरू करें


इसकी जरूरत है ... धन्यवाद!
nykc

1

मैंने उबुन्टु 18.04 में यह कोशिश की और मेरे लिए काम करने वाला एकमात्र समाधान है:

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

-4

मुझे लगता है कि caching_sha2_password एन्क्रिप्शन के बिना mysql सर्वर को कॉन्फ़िगर करना उपयोगी नहीं है, हमें नेटवर्क के माध्यम से सुरक्षित जानकारी प्रकाशित करने, भेजने या प्राप्त करने का एक तरीका खोजना होगा। जैसा कि आप नीचे दिए गए कोड में देख रहे हैं कि मैं वेरिएबल $ db_name का उपयोग नहीं करता हूं, और स्टैंडअलोन कॉन्फ़िगरेशन पासवर्ड के साथ mysql सर्वर में उपयोगकर्ता का उपयोग कर रहा हूं। बस एक स्टैंडर यूजर पासवर्ड बनाएं और सभी निजीकरणों को कॉन्फ़िगर करें। यह काम करता है, लेकिन मैं कैसे बिना गंभीरता के कहा।

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

?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.