MySQL 8.0 - 客户端不支持服务器请求的身份验证协议; 考虑升级MySQL客户端

Pig*_*ig 165 mysql node.js

我是node.js和MySQL初学者,我刚开始设置并尝试一些基本代码.但是,由于某种原因,我甚至无法与服务器建立简单的连接.我使用默认设置安装最新的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!");
    });
Run Code Online (Sandbox Code Playgroud)

以下是命令提示符中发现的错误:

C:\Users\mysql-test>node app.js
    C:\Users\mysql-test\node_modules\mysql\lib\protocol\Parse
    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:\Users\mysql-
test\node_modules\mysql\lib\protocol\sequences\Sequence.js:52:14)
    at Handshake.ErrorPacket (C:\Users\mysql-test\node_mo
dules\mysql\lib\protocol\sequences\Handshake.js:130:18)
    at Protocol._parsePacket (C:\Users\mysql-test\node_mo
dules\mysql\lib\protocol\Protocol.js:279:23)
    at Parser.write (C:\Users\mysql-test\node_modules\mys
ql\lib\protocol\Parser.js:76:12)
    at Protocol.write (C:\Users\mysql-test\node_modules\m
ysql\lib\protocol\Protocol.js:39:16)
    at Socket.<anonymous> (C:\Users\mysql-test\node_modul
es\mysql\lib\Connection.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:\Users\mysql-test\node_module
s\mysql\lib\protocol\Protocol.js:145:48)
    at Protocol.handshake (C:\Users\mysql-test\node_modul
es\mysql\lib\protocol\Protocol.js:52:23)
    at Connection.connect (C:\Users\mysql-test\node_modul
es\mysql\lib\Connection.js:130:18)
    at Object.<anonymous> (C:\Users\mysql-test\server.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)
Run Code Online (Sandbox Code Playgroud)

我已经阅读了一些内容,例如:https : //dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507

但我仍然不确定如何解决我的问题.任何帮助将不胜感激:D

小智 430

在MYSQL Workbench中执行以下查询

ALTER USER'root'@'localhost'用mysql_native_password识别BY'密码'

在执行此操作后尝试使用节点进行连接

  • 这对我有用.不要忘了"冲洗特权;"之后. (33认同)
  • 如果您知道,请用您的root密码替换'password' (9认同)
  • 它有效......但为什么它之前没有工作以及为什么它在这个查询之后仍然有效仍然是一个问题. (8认同)
  • 没有@localhost它对我有用(我想这可能是因为它不适合root用户) (6认同)
  • @GuilhermeMatuella,您好:这是因为在MySQL 8.0中引入了“ caching_sha2_password”,但尚未实现Node.js版本。 (6认同)
  • 如果删除 @'localhost' 部分,则会收到以下错误:“错误代码:1396。'root'@'%' 的操作 ALTER USER 失败” (4认同)
  • 大家好!有人可以深入了解这里发生的事情吗?为什么更改本机用户会使这种错误消失? (3认同)
  • @GuilhermeMatuella请参阅下面的我的答案以获取详细说明/sf/answers/3955634581/ (2认同)
  • 不要跳过下面的[这个](/sf/answers/3955634581/)答案 (2认同)
  • @GuilhermeMatuella 有关此解决方案如何工作以及为什么在生产环境中不建议这样做的详细信息,请参阅下面的我的答案:/sf/answers/3955634581/ (2认同)

upu*_*ing 62

使用旧mysql_native_password作品:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourRootPassword';
-- or
CREATE USER 'foo'@'%' IDENTIFIED WITH mysql_native_password BY 'bar';
-- then
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

这是因为caching_sha2_password在MySQL 8.0中引入,但Node.js版本尚未实现.您可以查看此拉取请求此问题以获取更多信息.可能很快就会出现修复!


Aid*_*din 34

首先让我们弄清楚发生了什么。

MySQL 8支持可插拔身份验证方法。默认情况下,将使用其中一个命名的名称caching_sha2_password,而不是我们的旧版本mysql_native_passwordsource)。很明显,使用加密算法并多次握手比使用已有24年的普通口令传递更为安全!

现在,问题出mysqljs在Node(用于安装npm i mysql和在Node代码中使用的软件包)尚不支持MySQL 8的这种新的默认身份验证方法。问题在这里:https : //github.com/mysqljs/mysql/issues/1507并在3年后的2019年7月仍然开放。 (2019年6月更新:mysqljs中有一个新的PR现在可以修复这个!)

您的选择

选项1)使用旧的“ native_password”降级“ MySQL”以进行身份​​验证

这就是每个人的建议(例如,上方的最佳答案)。您只需进入mysql并运行root使用旧native_password方法进行身份验证就可以的查询:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...
Run Code Online (Sandbox Code Playgroud)

好消息是,生活将会变得很简单,您仍然可以使用Sequel Pro这样的旧工具而不会出现任何问题。但是问题是,您没有利用向您提供的更安全(并且很酷,请参阅下文)的东西。

选项2)用MySQL Connecter X DevAPI替换“ Node”包

适用于Node的MySQL X DevAPI是由http://dev.mysql.com官方提供的Node的Mysqljs软件包的替代品。

它像支持caching_sha2_password身份验证的超级按钮一样工作。(只需确保将端口33060用于X协议通信即可。)

不好的是,您已经离开了旧的mysql程序包,每个人都习惯并依赖它。

好消息是,您的应用现在更安全了,您可以利用我们的好朋友没有提供的大量新功能!只需查看X DevAPI教程,您就会发现它具有大量可以方便使用的新性感功能。您只需要付出学习曲线的代价即可,任何技术升级都可能附带该学习曲线。:)

PS。不幸的是,这个XDevAPI包还没有类型定义(TypeScript可以理解),因此,如果您使用的是Typescript,则会遇到问题。我尝试使用dts-gen和生成.d.ts dtsmake,但未成功。所以记住这一点。

干杯!

  • 很好,这个答案实际上解释了 mysql_native_password 而不仅仅是告诉你这样做 (23认同)
  • 是的,一次正确的解释。干得好,艾丁。我多么希望连接应用程序不会自动将端口 3306 配置到 MySQL。我们很难从 3306 中获取 MySQL 和 MariaDB。 (6认同)
  • `mysql2` 优雅地解决了这个问题。我认为这是最正确的解决方案。 (3认同)
  • 感谢您发布有关一岁问题的详细答案。:] (2认同)
  • @emen,如果您不习惯阅读库代码(代替适当的文档),或者您需要引入 Typescript,或者安全性对您的项目来说不是危及生命的问题,那么不,不要选择选项#2。:) (2认同)
  • 感谢@Henrique 提供的详细信息。是的,这不应该是一个答案,除非你采用 stackoverflow 答案,例如:https://pics.me.me/my-eyes-on-stackoverflow-17-it-as-getlientokens-nosuch-refresh-token -1-then-function-tokens-61976976.png ;) (2认同)

小智 17

如果 ALTER USER ... 命令行对您不起作用,并且您使用的是 Windows 10,请尝试按照以下步骤操作:

1)在windows搜索栏中输入MySQL

2) 打开 MySQL Windows 安装程序 - 社区

3)寻找“MySQL服务器”并点击重新配置 第 3 步

4) 点击“下一步”,直到到达“身份验证方法”阶段

5)在“身份验证方法”阶段,选中第二个选项“使用传统身份验证方法” 第 5 步

6)然后按照Windows安装程序给出的步骤直到结束

7) 完成后,从 Windows 搜索栏进入“服务”,单击“启动”MySql81”。

现在,再试一次,MySQL 和 Node.js 之间的连接应该可以工作了!


Alo*_*lok 16

最干净的解决方案是执行以下命令,这个问题就会消失:

npm uninstall mysql
npm install mysql2
Run Code Online (Sandbox Code Playgroud)

然后在您的代码中正常使用它:

var mysql = require('mysql2');
    
var con = mysql.createConnection({
 host: "localhost",
 user: "root",
 password: "password"
});
    
con.connect(function(err) {
 if (err) throw err;
 console.log("Connected!");
});
Run Code Online (Sandbox Code Playgroud)

我的系统中没有任何 MySQL 客户端,但我docker container有一个映像,这给了我这个问题。只需安装即可mysql2解决问题。

您也可以在这里找到解决方案,在官方mysqlnpm 包问题的答案中提到。一切顺利。


Sid*_*ant 14

尽管接受的答案是正确的,但我还是希望创建一个新用户,然后使用该用户访问数据库。

create user nodeuser@localhost identified by 'nodeuser@1234';
grant all privileges on node.* to nodeuser@localhost;
ALTER USER 'nodeuser'@localhost IDENTIFIED WITH mysql_native_password BY 'nodeuser@1234';
Run Code Online (Sandbox Code Playgroud)

  • 如果有人想走这条路,这是一篇带有一些解释的文章:https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql (2认同)
  • “nodeuser@1234”到底是什么?新密码?为什么我们需要那个? (2认同)

jos*_*ell 13

MySQL 8的完整步骤

连接到MySQL

$ mysql -u root -p
Enter password: (enter your root password)
Run Code Online (Sandbox Code Playgroud)

重置您的密码

(替换your_new_password为您要使用的密码)

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
mysql> FLUSH PRIVILEGES;
mysql> quit
Run Code Online (Sandbox Code Playgroud)

然后尝试使用节点连接


小智 9

最简单的答案是:-

  1. 在节点中使用 mysql2 而不是 mysql

在节点中安装 mysql2

  1. npm 安装 mysql2

不要降级你的 mysql 数据库。

你已准备好出发。 快乐编码!


Sal*_*mim 8

降级可能不是一个好的选择,因为:

  1. 它的升级是有原因的(为了提供更好的身份验证)。
  2. 您可能没有足够的权限来进行此类更改。

您可以使用mysql2包代替mysql. 它的大部分 API 与 mysqljs 兼容。此外,它还承诺提供支持。

像这样使用它:( const mysql = require('mysql2/promise')对于基于承诺的方法)

您可以在这里阅读更多信息mysql2: https: //www.npmjs.com/package/mysql2


Sac*_*Kps 8

对于 MySql 8,不要更改root用户的身份验证,而是创建一个具有所有权限的新用户,并将身份验证方法从 caching_sha2_password 更改为 mysql_native_password。请查看Ochuko Ekrresa 的文档以了解详细步骤。

步骤摘要:

  1. 以 root 身份登录 mysql -u root -p
  2. 创建新用户CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
  3. 授予所有权限GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';

检查上述文档链接以获取有关授予特定权限的详细信息。

  1. 重新加载权限FLUSH PRIVILEGES;
  2. 退出 MySqlquit;并再次登录mysql -u [newuser] -p;
  3. 最后一步更改身份验证ALTER USER 'newuser'@'localhost' IDENTIFIED WITH mysql_native_password by 'password';

附加信息:对于我来说,更改 root 身份验证后,我遇到了身份验证问题并且无法登录。所以我重置了密码(重置密码文档)。


小智 7

在Mysql最新的docker容器中

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';
Run Code Online (Sandbox Code Playgroud)

  • 警告:这会降低您的数据库的安全性 (2认同)

Ric*_*ich 7

如果遇到此错误,但仍想使用MySQL版本8,则可以通过在使用Docker创建数据库时告诉MySQL服务器使用旧版身份验证插件来实现。

因此,您的撰写文件将如下所示:

# Use root/example as user/password credentials

version: '3.1'

services:

  db:
    image: mysql:8.0.15
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
       MYSQL_ROOT_PASSWORD: 'pass'
       MYSQL_DATABASE: 'db'
       MYSQL_USER: 'user'
       MYSQL_PASSWORD: 'pass'
    ports:
      - 3318:3306
    # Change this to your local path
    volumes:
      - ~/Database/ORM_Test:/var/lib/mysql
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用这个“command”,但在 Node.js 中使用“mysql”时仍然收到不支持的身份验证错误消息 (2认同)
  • @JuhaUntinen 确保删除了 Docker 容器(由 docker-compose 创建的容器)和卷(~/Database/ORM_Test),然后再次运行“docker-compose up”。否则,“命令”中的更改将不会应用。这对我的情况有帮助。 (2认同)

Les*_*ter 7

在 MySQL 8.0 中,caching_sha2_password是默认的身份验证插件而不是mysql_native_password. ...

这个问题中的大多数答案都会导致身份验证机制从 降级caching_sha2_passwordmysql_native_password。从安全的角度来看,这非常令人失望。

文档广泛讨论caching_sha2_password了为什么不应该将其作为降级身份验证方法的首选。

有了这个,我相信艾丁的答案应该是公认的答案。不要降级身份验证方法,而是使用与服务器版本匹配的连接器


小智 6

如果您使用的是 docker,它对我有用!

docker-compose.yml添加以下行:

mysql:
   ...    
   command: --default-authentication-plugin=mysql_native_password
   restart: always
Run Code Online (Sandbox Code Playgroud)

之后,down容器up又一次。


shi*_*tel 5

您可以在此处找到原始文档:https : //dev.mysql.com/doc/dev/connector-nodejs/8.0/

'use strict';

const mysqlx = require('@mysql/xdevapi');

const options = {
  host: 'localhost',
  port: 33060,
  password: '******',
  user: 'root',
  schema: 'yourconference'
};

mysqlx.getSession(options)
  .then(session => {
          console.log(session.inspect());
           session.close();
  }).catch(err => {
    console.error(err.stack);
    process.exit(1);
  });
Run Code Online (Sandbox Code Playgroud)


Cha*_*win 5

对于 Windows 10 mysql 上现有的 mysql 8.0 安装,

  1. 启动安装程序,

  2. 单击 QuickAction 下的“重新配置”(MySQL 服务器左侧),然后

  3. 单击“下一步”进入接下来的 2 个屏幕,直至到达

  4. 在“身份验证方法”中,选择“使用旧版身份验证方法(保留 MySQL 5.x 兼容性”)

  5. 一直点击直到安装完成


小智 5

简单我卸载 mysql安装 mysql2来解决这个问题。

npm uninstall mysql && npm i mysql2
Run Code Online (Sandbox Code Playgroud)