mysql 8.0-客户端不支持服务器请求的认证协议;考虑升级mysql客户端

vu8f3i0k  于 2021-06-21  发布在  Mysql
关注(0)|答案(24)|浏览(510)

由于某种原因,我无法与服务器建立简单的连接。我用默认设置安装了最新的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:\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)

我读过一些东西,比如:https://dev.mysql.com/doc/refman/5.5/en/old-client.htmlhttps网址:github.com/mysqljs/mysql/issues/1507
但我仍然不知道如何解决我的问题。任何帮助都将不胜感激:d

a7qyws3x

a7qyws3x1#

降级可能不是一个好的选择,因为:
它的升级是有原因的(为了提供更好的身份验证)。
您可能没有足够的权限进行此类更改。
你可以用 mysql2 Package 代替 mysql . 它的api主要与mysqljs兼容。此外,它还承诺提供支持。
像这样使用: const mysql = require('mysql2/promise') (用于基于承诺的方法)
你可以阅读更多关于 mysql2 在这里:https://www.npmjs.com/package/mysql2
希望有帮助。:)

qnzebej0

qnzebej02#

我们先弄清楚发生了什么事。
mysql 8支持可插入的身份验证方法。默认情况下,其中一个 caching_sha2_password 是用而不是我们的好老 mysql_native_password (来源)。很明显,使用加密算法进行多次握手比使用24年的普通密码传递更安全!
现在,问题是 mysqljs 在节点中(与您一起安装的软件包 npm i mysql 并在节点代码中使用)还不支持MySQL8这种新的默认身份验证方法。问题在于:https://github.com/mysqljs/mysql/issues/1507 3年后,截至2019年7月,仍在营业。
2019年6月更新:mysqljs中现在有一个新的pr来修复这个问题!
2020年2月更新:显然,它计划在mysqljs的第3版中发布。
2020年7月更新:显然它还没有发布(至少到2020年4月),但是它声称node-mysql2支持身份验证交换请求。如有必要,请在下面发表评论 node-mysql2 在这个问题上工作得很好--我稍后会自己测试它。

您当前的选项

选项1)降级“mysql”以使用旧的“原生密码”进行身份验证

这是每个人在这里建议的(例如上面的顶部答案)。你只要进入 mysql 然后运行一个查询 root 用旧的可以吗 native_password 授权方法:

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

好的是,生活会很简单,你仍然可以使用像sequel pro这样的老工具,而没有任何问题。但问题是,你没有利用一个更安全(和酷,阅读下文)的东西提供给你。

选项2)用mysql connecter x devapi替换“node”包

mysql x devapi for node是node的mysqljs包的替代品,由http://dev.mysql.com official 伙计们。
它就像一个护身符 caching_sha2_password 身份验证(一定要用左舷 33060 用于x协议通信。)
糟糕的是,你离开了我们的老朋友 mysql 每个人都如此习惯和依赖的软件包。
好在,你的应用程序现在更安全了,你可以利用我们的老朋友没有提供的大量新东西!只要看看x devapi的教程,你就会发现它有很多新的性感功能,可以派上用场。你只需要付出学习曲线的代价,任何技术升级都会带来学习曲线。:)
不幸的是,这个xdevapi包还没有类型定义(typescript可以理解),所以如果您使用typescript,您将遇到问题。我试着用 dts-gen 以及 dtsmake ,但没有成功。所以记住这一点。
干杯!

kjthegm6

kjthegm63#

您可以在此处找到原始文档: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);
  });
nkoocmlb

nkoocmlb4#

如果您有权创建一个新的用户权限,那么就这样做,以正常连接node.js,这对我来说是有效的

llmtgqce

llmtgqce5#

您可以跳过orm、构建器等,并使用 sqler 以及 sqler-mdb .

-- create this file at: db/mdb/read.table.rows.sql
SELECT TST.ID AS "id", TST.NAME AS "name", NULL AS "report",
TST.CREATED_AT AS "created", TST.UPDATED_AT AS "updated"
FROM TEST TST
WHERE UPPER(TST.NAME) LIKE CONCAT(CONCAT('%', UPPER(:name)), '%')
const conf = {
  "univ": {
    "db": {
      "mdb": {
        "host": "localhost",
        "username":"admin",
        "password": "mysqlpassword"
      }
    }
  },
  "db": {
    "dialects": {
      "mdb": "sqler-mdb"
    },
    "connections": [
      {
        "id": "mdb",
        "name": "mdb",
        "dir": "db/mdb",
        "service": "MySQL",
        "dialect": "mdb",
        "pool": {},
        "driverOptions": {
          "connection": {
            "multipleStatements": true
          }
        }
      }
    ]
  }
};

// create/initialize manager
const manager = new Manager(conf);
await manager.init();

// .sql file path is path to db function
const result = await manager.db.mdb.read.table.rows({
  binds: {
    name: 'Some Name'
  }
});

console.log('Result:', result);

// after we're done using the manager we should close it
process.on('SIGINT', async function sigintDB() {
  await manager.close();
  console.log('Manager has been closed');
});
ndasle7k

ndasle7k6#

虽然接受的答案是正确的,但我更喜欢创建一个新用户,然后使用该用户访问数据库。

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';
tv6aics1

tv6aics17#

确保您正在使用的用户

kyvafyod

kyvafyod8#

在mysql 8.0中, caching_sha2_password 是默认的身份验证插件,而不是 mysql_native_password. ... 这个问题的大多数答案都会导致身份验证机制从 caching_sha2_passwordmysql_native_password . 从安全的Angular 来看,这是相当令人失望的。
本文件广泛讨论 caching_sha2_password 当然,为什么不应该首先选择降级身份验证方法。
因此,我相信艾丁的答案应该是公认的答案。与其降级身份验证方法,不如使用与服务器版本匹配的连接器。

bbmckpt7

bbmckpt79#

我在服务器上有mysql,在另一台服务器上有nodejs应用程序
在mysql工作台中执行以下查询
将用户“root”@“%”标识为mysql\u native\u password,修改为“password”

gcmastyq

gcmastyq10#

除上述答案外;执行以下命令后

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'

如果出现以下错误:

[ERROR] Column count of mysql.user is wrong. Expected 42, found 44. The table is probably corrupted

然后以admin的身份输入cmd;在cmd中设置mysql server bin文件夹的路径

set path=%PATH%;D:\xampp\mysql\bin;

然后运行命令:

mysql_upgrade --force -uroot -p

这将更新服务器和系统表。
然后您应该能够在工作台的查询中成功运行以下命令:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'

然后记住执行以下命令:

flush privileges;

完成所有这些步骤后,您应该能够成功地连接到mysql数据库。希望这有帮助。。。

flvlnr44

flvlnr4411#

mysql 8的完整步骤

连接到mysql

$ mysql -u root -p
Enter password: (enter your root password)

重置密码

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

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
mysql> FLUSH PRIVILEGES;
mysql> quit

然后尝试使用节点连接

mqxuamgl

mqxuamgl12#

对于windows 10 mysql上现有的mysql 8.0安装,
启动安装程序,
单击quickaction下的“重新配置”(mysql服务器左侧),然后
单击next(下一步)在接下来的2个屏幕中前进,直到到达
在“authentication method”中,选择“use legacy authentication method(retain mysql 5.x compatibility)”选项
一直单击直到安装完成

mspsb9vt

mspsb9vt13#

如果遇到此错误但仍要使用 MySQL 版本8。您可以通过告诉mysql服务器在使用创建数据库时使用遗留身份验证插件来实现这一点 Docker .
所以,你的 compose 文件将如下所示:


# 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
5t7ly7z5

5t7ly7z514#

使用旧的 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;

这是因为 caching_sha2_password mysql 8.0中引入了node.js版本,但尚未实现。有关更多信息,请参见此pull请求和此问题。可能很快就会有解决办法了!

yv5phkfx

yv5phkfx15#

我犯了这个错误好几个小时,最后才弄清楚原因。正如zchary所说,请非常仔细地检查是否传入了正确的数据库名称。
事实上,在我的情况下,更糟的是:我在传递我所有的信息 createConnection() 参数为 undefined 因为我是从 process.env . 或者我是这么想的!然后我意识到我的调试和测试npm脚本工作了,但是正常运行失败了。隐马尔可夫模型。。。
所以关键是-mysql似乎抛出这个错误,即使用户名、密码、数据库和主机字段都是 undefined ,这有点误导。。
无论如何,故事的士气-检查愚蠢和似乎不太可能的事情第一!

相关问题