【问题标题】:Not able to authenticate my Node js(v10.15.3) app, npm mysql (v2.17.1) with MySQL(8.0.15) (ER_ACCESS_DENIED_ERROR)无法使用 MySQL(8.0.15) (ER_ACCESS_DENIED_ERROR) 验证我的 Node js(v10.15.3) 应用程序、npm mysql (v2.17.1)
【发布时间】:2020-01-03 06:58:50
【问题描述】:

我正在运行一个简单的 Nodejs(v10.15.3) 应用程序,试图访问 MySQL 服务器 (8.0.15)。 npm mysql 包版本为 v2.17.1。 脚本如下图,

var mysql = require('mysql');

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'test',
    password: '2222',
    database: 'database',
    debug: true          
});

connection.connect(function(err) {
    if (err) {
        console.log(err.stack);
        throw err;            
    }

    console.log("Connected!");
});

奇怪的是我可以从 MySQL 客户端使用相同的凭据登录。 我几乎尝试了其他论坛中提到的所有方法。我尝试过的一些事情,

  1. 我已将密码插件类型从 caching_sha2_password 更改为 mysql_native_password 以供用户测试。
  2. 更新了用户的密码并刷新了权限。

附加整个堆栈跟踪。

<-- HandshakeInitializationPacket {
  protocolVersion: 10,
  serverVersion: '8.0.13',
  threadId: 71,
  scrambleBuff1: <Buffer 16 5c 10 12 68 49 73 68>,
  filler1: <Buffer 00>,
  serverCapabilities1: 65535,
  serverLanguage: 33,
  serverStatus: 2,
  serverCapabilities2: 50175,
  scrambleLength: 21,
  filler2: <Buffer 00 00 00 00 00 00 00 00 00 00>,
  scrambleBuff2: <Buffer 41 06 27 5a 0c 4c 4c 30 2f 72 0d 7e>,
  filler3: <Buffer 00>,
  pluginData: 'mysql_native_password',
  protocol41: true }

--> (71) ClientAuthenticationPacket {
  clientFlags: 455631,
  maxPacketSize: 0,
  charsetNumber: 33,
  filler: undefined,
  user: 'test',
  scrambleBuff:
   <Buffer fa ee eb f2 89 a4 f0 91 a9 d1 aa f2 77 08 76 bb ec a2 51 8b>,
  database: 'simplify_meetup',
  protocol41: true }

<-- (71) ErrorPacket {
  fieldCount: 255,
  errno: 1045,
  sqlStateMarker: '#',
  sqlState: '28000',
  message:
   'Access denied for user \'test\'@\'localhost\' (using password: YES)' }

Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'test'@'localhost' (using password: YES)
    at Handshake.Sequence._packetToError (D:\Development\simplify-meetup\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
    at Handshake.ErrorPacket (D:\Development\simplify-meetup\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18)
    at Protocol._parsePacket (D:\Development\simplify-meetup\node_modules\mysql\lib\protocol\Protocol.js:291:23)
    at Parser._parsePacket (D:\Development\simplify-meetup\node_modules\mysql\lib\protocol\Parser.js:433:10)
    at Parser.write (D:\Development\simplify-meetup\node_modules\mysql\lib\protocol\Parser.js:43:10)
    at Protocol.write (D:\Development\simplify-meetup\node_modules\mysql\lib\protocol\Protocol.js:38:16)
    at Socket.<anonymous> (D:\Development\simplify-meetup\node_modules\mysql\lib\Connection.js:91:28)
    at Socket.<anonymous> (D:\Development\simplify-meetup\node_modules\mysql\lib\Connection.js:525:10)
    at Socket.emit (events.js:189:13)
    at addChunk (_stream_readable.js:284:12)
    --------------------
    at Protocol._enqueue (D:\Development\simplify-meetup\node_modules\mysql\lib\protocol\Protocol.js:144:48)
    at Protocol.handshake (D:\Development\simplify-meetup\node_modules\mysql\lib\protocol\Protocol.js:51:23)
    at Connection.connect (D:\Development\simplify-meetup\node_modules\mysql\lib\Connection.js:119:18)
    at D:\Development\simplify-meetup\routes\EventReminderAPI.js:20:16
    at Layer.handle [as handle_request] (D:\Development\simplify-meetup\node_modules\express\lib\router\layer.js:95:5)
    at next (D:\Development\simplify-meetup\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (D:\Development\simplify-meetup\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (D:\Development\simplify-meetup\node_modules\express\lib\router\layer.js:95:5)
    at D:\Development\simplify-meetup\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (D:\Development\simplify-meetup\node_modules\express\lib\router\index.js:335:12)

【问题讨论】:

  • 您是否检查过test 用户帐户是否确实是使用mysql_native_password 插件创建的? select user, plugin from mysql.user where user = 'test';如果确实如此,那可能是密码不对。
  • 我只使用mysql_native_password 插件创建了用户。我可以在 mysql 命令行中使用相同的凭据登录。
  • mysql 命令行也支持caching_sha2_password 插件,所以在这种情况下它没有多大帮助。除非密码不正确(或者用户甚至不存在),否则没有理由出现此错误,这可能意味着原始值确实错误,或者客户端(在本例中为 node.js 客户端)正在使用散列算法这与创建该用户时选择的服务器端身份验证插件使用的不匹配(这肯定会发生在caching_sha2_password 的情况下,因为尚不支持)。
  • @ruiquelhas,有没有办法知道 nodejs 的 mysql 包在内部使用的哈希算法?有没有办法可以传递要使用的散列类型?
  • 据我记得,那个特定的 node.js 驱动程序支持mysql_old_passwordmysql_native_password。在任何情况下,如果您使用 MySQL 8.0 并且不使用它们显式创建用户帐户(服务器甚至不再支持 mysql_old_password),它们都将起作用,因为默认情况下,用户是使用 @987654340 创建的@ 插入。我之前提到的查询的输出是什么?

标签: mysql node.js node-mysql


【解决方案1】:

知道了。如果您安装了 MySQL 8.0.4 及更高版本,您将可以选择选择最新的身份验证方法或支持旧的身份验证方法。如果选择第一个选项,MySQL 服务器仅支持caching_sha2_password。另一个旧选项支持mysql_native_password

由于目前 npm mysql 客户端包不支持最新的身份验证方法,而我在 MySQL 服务器上选择了最新的身份验证方法,所以我遇到了这个问题。

选项屏幕将如下所示。发布更改选项,它就像魅力一样。

感谢 @ruiquelhas 指导我解决潜在问题 :)

【讨论】:

    【解决方案2】:

    验证测试用户是否有权限访问数据库; 在 mysql shell 中运行

    SHOW GRANTS FOR 'test'@'localhost';
    

    这将让您看到用户有权访问的所有数据库。

    【讨论】:

    • 我添加了列出用户授权的屏幕截图。它可以访问所有数据库。
    猜你喜欢
    • 2015-06-06
    • 2011-06-19
    • 1970-01-01
    • 2021-12-03
    • 2016-06-30
    • 2020-08-21
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    相关资源
    最近更新 更多