web-dev-qa-db-ja.com

MySQL 8.0 - クライアントはサーバから要求された認証プロトコルをサポートしません。 MySQLクライアントのアップグレードを検討

私はnode.jsとMySQLの初心者で、基本的なコードを設定して試してみました。しかし、どういうわけか単純なサーバーへの接続さえできません。 Node.JSと一緒に最新のMySQL Community 8.0データベースをデフォルト設定でインストールします。

これは私の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

103
Pig

MYSQLワークベンチで以下のクエリを実行します。

Mysql_native_passwordと 'password'で識別されるALTER USER 'root' @ 'localhost'

接続後にノードを使用して接続してみてください

254
Pras

古い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バージョンがまだ実装されていないためです。あなたは このプルリクエスト そして この問題 を見ることができます。おそらくすぐに修正が行われるでしょう。

44
upupming

まず、何が起こっているのかを明確にしましょう。

MySQL 8はプラグ可能な認証方法をサポートしています。デフォルトでは、古くなったcaching_sha2_passwordsource )ではなく、mysql_native_passwordという名前の1つが使用されます。いくつかのハンドシェイクで暗号アルゴリズムを使用することは、 24年 に存在していた単純なパスワードの受け渡しよりも安全であることは明らかです。

現在、問題はNodeのmysqljsnpm i mysqlでインストールし、Nodeコードで使用するパッケージ)がこの新しいデフォルトをサポートしていないことです。 MySQL 8の認証方式。問題はここにあります: https://github.com/mysqljs/mysql/issues/1507 であり、3年後の2019年7月時点でまだ開いています。(UPDATE June 2019:これを修正するための mysqljsの新しいPR があります!)

あなたのオプション

オプション1)「MySQL」をダウングレードして、古き良き「native_password」を使用して認証する

ここで誰もが提案していることです(例: 上記のトップアンサー )。 mysqlにアクセスして、認証に古いnative_passwordメソッドを使用してrootで問題ないというクエリを実行します。

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

良いことは、人生はシンプルになり、Sequel Proのような古き良きツールを 任意の問題 なしで使用できることです。しかし、問題は、あなたが利用できるより安全な(そしてクールな、以下を読んで)ものを利用していないことです。

オプション2)「ノード」パッケージをMySQL Connecter X DevAPIに置き換えます

NodeのMySQL X DevAPI は、 http://dev.mysql.com によって提供される NodeのMysqljsパッケージ の代わりになります。

caching_sha2_password認証をサポートするチャームのように機能します。 (必ず Xプロトコル通信 にポート33060を使用してください。)

悪いことは、あなたが私たちの古いmysqlパッケージを残しているので、誰もが慣れて依存しているということです。

良いことは、あなたのアプリがより安全になり、古き良き友人が提供しなかったたくさんの新しいものを活用できることです! X DevAPIのチュートリアル をご覧ください。便利な機能がたくさんあります。学習曲線の料金を支払うだけで、テクノロジーのアップグレードに伴うことが予想されます。 :)

PS。残念ながら、このXDevAPIパッケージにはまだ型定義(TypeScriptが理解できる)がないため、TypeScriptを使用している場合は問題が発生します。 dts-genおよびdtsmakeを使用して.d.tsを生成しようとしましたが、成功しませんでした。それを覚えておいてください。

乾杯!

16
Aidin

受け入れられた答えは正しいですが、私は新しいユーザーを作成してからそのユーザーを使用してデータベースにアクセスすることを望みます。

create user [email protected] identified by '[email protected]';
grant all privileges on node.* to [email protected];
ALTER USER 'nodeuser'@localhost IDENTIFIED WITH mysql_native_password BY '[email protected]';
9
Siddhant

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

それからノードを使って接続してみてください

6
joshuakcockrell

Mysqlの最新dockerコンテナ

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';
5
MacielJr

このエラーが発生しても、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
2
Rich

ALTER USER ...コマンドラインが機能しない場合、およびWindows 10を使用している場合は、次の手順を試してください。

1)Windowsの検索バーに「MySQL」と入力します

2)MySQL Windowsインストーラーを開く-コミュニティ

3)「MySQLサーバー」を探し、「再構成」をクリックします step 3

4)「認証方法」フェーズに到達するまで「次へ」をクリックします

5)「認証方法」フェーズで、2番目のオプション「レガシー認証方法を使用」をチェックします step 5

6)次に、Windowsインストーラーによって指定された手順を最後まで実行します

7)完了したら、Windowsの検索バーから[サービス]に移動し、[開始] MySql81をクリックします。

さて、もう一度試してください。MySQLとNode.js間の接続が機能するはずです!

2
Campalo

既存のmysql 8.0がWindows 10 mysqlにインストールされている場合は、(1)インストーラを起動し、(2)QuickActionの下の "recongifure"(MySQL Serverの左側) 1 をクリックします。 [Authentication Method]に到達するまで(2)、2つの画面で[Use Legacy Authentication Method(MySQL 5.xの互換性を保持)]を選択します。 2 (5)インストールが完了するまでクリックし続けます

1
Charles Goodwin

あなたがここで見つけることができるオリジナルの文書: 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);
  });
1
shivang patel

私はサーバー上のMYSQLと他のサーバー上のnodejsアプリケーションを持っています

MYSQLワークベンチで以下のクエリを実行します。

Mysql_native_passwordを 'password'で識別したユーザー 'root' @ '%'の変更

1
iomar

MySQLサーバーのインストーラーを実行し、私のSQLサーバーを再設定するだけです…これは私にとってはうまくいきました。

0

MySQLユーザーの特権とユーザー名/パスワードを確認します。

エラーをキャッチするには、オーバーライドされた_delegateErrorメソッドを使用すると常に便利です。あなたの場合、これは次のように見える必要があります。

var mysql = require('mysql');

var con = mysql.createConnection({
  Host: "localhost",
  user: "root",
  password: "password",
  insecureAuth : true
});

var _delegateError = con._protocol._delegateError;

con._protocol._delegateError = function(err, sequence) {
    if (err.fatal)
        console.trace('MySQL fatal error: ' + err.message);

    return _delegateError.call(this, err, sequence);
};

con.connect(function(err) {
  if (err) throw err;

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

この構造は、致命的なエラーを追跡するのに役立ちます。

0
B. Bohdan

私はMySQLと同じ問題を抱えていて、XAMPPを使用してMySQLに接続し、MySQL用のウィンドウ(コントロールパネル - 管理ツール - サービス)、およびフォルダdb.js(データベースを管理する)でサービスを停止することで解決します。パスワードを空にする(ここであなたは見ることができる:)

const mysql = require('mysql');
const connection = mysql.createConnection({
  Host: 'localhost',
  user: 'root',
  password: ''
});
0
Mohammad Jozaa