請升級MySQL用戶端:MySQL 8.0 - 用戶端不支援伺服器要求的驗證協定
P粉574695215
P粉574695215 2023-10-10 09:34:48
0
2
675

由於某種原因,我無法與伺服器建立簡單的連線。我使用預設設定安裝了最新的 MySQL Community 8.0 資料庫以及 Node.JS。

這是我的node.js程式碼

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

以下是命令提示字元中發現的錯誤:

C:Usersmysql-test>node app.js
    C:Usersmysql-testnode_modulesmysqllibprotocolParse
    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:Usersmysql-
testnode_modulesmysqllibprotocolsequencesSequence.js:52:14)
    at Handshake.ErrorPacket (C:Usersmysql-testnode_mo
dulesmysqllibprotocolsequencesHandshake.js:130:18)
    at Protocol._parsePacket (C:Usersmysql-testnode_mo
dulesmysqllibprotocolProtocol.js:279:23)
    at Parser.write (C:Usersmysql-testnode_modulesmys
qllibprotocolParser.js:76:12)
    at Protocol.write (C:Usersmysql-testnode_modulesm
ysqllibprotocolProtocol.js:39:16)
    at Socket.<anonymous> (C:Usersmysql-testnode_modul
esmysqllibConnection.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:Usersmysql-testnode_module
smysqllibprotocolProtocol.js:145:48)
    at Protocol.handshake (C:Usersmysql-testnode_modul
esmysqllibprotocolProtocol.js:52:23)
    at Connection.connect (C:Usersmysql-testnode_modul
esmysqllibConnection.js:130:18)
    at Object.<anonymous> (C:Usersmysql-testserver.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)

我讀過一些內容,例如: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507

但我仍然不確定如何解決我的問題。

P粉574695215
P粉574695215

全部回覆(2)
P粉161939752

摘要

  1. 如果您只是想消除錯誤,以專案安全風險為代價(例如,這只是個人專案或開發環境),請使用@Pras 的答案 -- ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password' 然後刷新權限
  2. 如果您想修復它,而不知道為什麼,只需安裝並使用mysql2(而不是mysql)並使用它- npm我mysql2mysql = require('mysql2');
  3. 如果您是一位充滿好奇心並始終渴望學習的開發人員,請繼續閱讀...:)

發生了什麼事?

我們首先要弄清楚發生了什麼事。

MySQL 8 支援可插入的身份驗證方法。預設情況下,使用其中一個名為 caching_sha2_password 的密碼,而不是我們的舊 mysql_native_password (來源)。顯然,使用多次握手的加密演算法比 24 中使用的普通密碼傳遞更安全。年

現在,問題是Node 中的mysqljs (使用npm i mysql 安裝並在Node 程式碼中使用它的軟體包)不支援這種新的預設驗證MySQL 8 的方法還沒有。問題在這裡: https://github.com/mysqljs/mysql/issues/1507 a> 截至 2019 年 7 月,三年後仍開放。

2019 年 6 月更新:有一個 mysqljs 中的新 PR a> 現在就解決這個問題!

2020 年 2 月更新: 顯然它是計畫來的在 mysqljs 版本 3 中

2020 年7 月更新: 顯然它還沒有出現在 中(截至至少2020 年4 月),但聲稱 node- mysql2 支援身份驗證切換請求。如果 node-mysql2 可以正常解決此問題,請在下面發表評論 - - 我稍後會親自測試一下。

2021 年4 月更新: 問題似乎仍然存在,就在3 天前,有人創建了一個fork 並實現了它——但在mysql.js 包中還不是正式的。另外,根據下面的評論,似乎 mysql2 套件 工作正常並且 正確支援身份驗證切換


您目前的選項

選項 1) [不建議] 降級「MySQL」以使用舊的「mysql_native_password」進行驗證

這就是每個人在這裡的建議(例如上面的最佳答案)。您只需進入 mysql 並執行一個查詢,說明 root 可以使用舊的 mysql_native_password 方法進行驗證:

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

好消息是,生活會變得簡單,您仍然可以使用 Sequel Pro 等優秀的舊工具,而無需 任何問題。但問題是,您沒有利用更安全(而且很酷,請閱讀下文)的東西。

選項 2) [Meh...] 將「Node」套件替換為 MySQL Connecter X DevAPI

#MySQL X DevAPI for NodeNode 的 Mysqljs 套件,由 http://dev.mysql.com 官方人員。

它的工作原理就像一個支援 caching_sha2_password 驗證的超級按鈕。 (只需確保您使用連接埠 33060 進行 X 協定通訊。)

糟糕的是,你已經離開了我們每個人都習慣和依賴的舊 mysql 包。

好處是,您的應用程式現在更加安全,您可以利用我們的好老朋友沒有提供的大量新功能!只要看看 X DevAPI 教學 並且你會發現它有大量新的性感功能可以派上用場。您只需要付出學習曲線的代價,預計會伴隨任何技術升級。 :)

PS。不幸的是,這個 XDevAPI 套件還沒有類型定義(TypeScript 可以理解),所以如果您使用 typescript,您將會遇到問題。我嘗試使用 dts-gen 和 dtsmake 產生 .d.ts,但沒有成功。所以請記住這一點。

選項 3) [建議] 將「mysql.js」替換為「mysql2.js」套件

如上所述,mysql套件(NPM套件連結)是仍然存在此問題(截至 2021 年 4 月)。但 mysql2 套件(NPM 套件連結)不是。因此,以下可能應該是簡單的答案!

npm un mysql && npm i mysql2

請注意,mysql2 是流行的mysql 的一個分支,但它的受歡迎程度(4 月份mysql2 每週下載量為62 萬次) 2020 年)已接近原始軟體包(2021 年4 月mysql 每週下載720K),因此進行切換似乎很合理!

P粉198749929

在 MYSQL Workbench 中執行下列查詢

更改使用者 'root'@'localhost' 透過 mysql_native_password BY 'password' 進行辨識;

其中 root 作為您的用戶 localhost 作為您的 URL 和 password 作為您的密碼

然後執行此查詢來刷新權限:

刷新權限;

#執行此操作後嘗試使用節點進行連線。

如果這不起作用,請嘗試不使用 @'localhost' 部分。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!