搜尋

首頁  >  問答  >  主體

請升級MySQL用戶端:MySQL 8.0 - 用戶端不支援伺服器要求的驗證協定

由於某種原因,我無法與伺服器建立簡單的連線。我使用預設設定安裝了最新的 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粉574695215P粉574695215415 天前777

全部回覆(2)我來回復

  • P粉161939752

    P粉1619397522023-10-11 09:08:13

    摘要

    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 截至 2019 年 7 月,三年後仍開放。

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

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

    2020 年7 月更新: 顯然它還沒有出現在 中(截至至少2020 年4 月),但聲稱 < a href="https://github.com/sidorares/node-mysql2" rel="noreferrer">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),因此進行切換似乎很合理!

    回覆
    0
  • P粉198749929

    P粉1987499292023-10-11 00:55:10

    在 MYSQL Workbench 中執行下列查詢

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

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

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

    刷新權限;

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

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

    回覆
    0
  • 取消回覆