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


274

なんらかの理由でサーバーに簡単に接続できません。最新の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.html https://github.com/mysqljs/mysql/issues/1507

しかし、まだ問題を解決する方法がわかりません。助けていただければ幸いです:D


2
SQLTools拡張機能を使用するすべてのVS Codeユーザーは、特に開発用コンピューターでmysqlインスタンスをアップグレードしたばかりの場合は、この投稿を参照してください
OzzyTheGiant

回答:


679

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

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

どこrootユーザーなど localhost、あなたのURLなどとpassword、パスワードなど

次に、このクエリを実行して権限を更新します。

flush privileges;

その後、ノードを使用して接続してみてください。

それがうまくいかない場合は、@'localhost'部分なしで試してください。


47
これでうまくいきました。flush privileges;後を忘れないでください。
Ali Hesa​​ri

12
@localhostがなくても機能しました(ルートユーザーではなかったためと思われます)
NicolasZ

10
知っている場合は、「password」をルートパスワードに置き換えます
Vedha Peri

11
それは機能します……しかし、なぜ以前は機能しなかったのか、なぜこのクエリの後に機能したのかはまだ疑問です。
saksham

9
こんにちは@GuilhermeMatuellaこれはcaching_sha2_passwordMySQL 8.0で導入されたためですが、Node.jsバージョンはまだ実装されていません。
Daksh Gargas

108

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

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

現在、問題はmysqljsNodeにあります(インストールしnpm i mysqlてNodeコードで使用するパッケージ)は、MySQL 8のこの新しいデフォルトの認証方法をまだサポートしていません。問題はここにあります:https : //github.com/mysqljs/mysql/issues/1507で、3年後の2019年7月の時点でまだオープンしています。

(2019年6月更新:これを修正するためにmysqljsに新しいPRがあります! (2020年2月更新:どうやらmysqljsのバージョン3で登場する予定です

あなたのオプション

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

それは誰もがここで提案することです(たとえば、上記のトップの回答)。あなたはちょうど入りmysql、クエリを実行して、認証にroot古いnative_password方法を使用して問題がないと言います:

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

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

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

MySQL X DevAPI for Nodeは、http://dev.mysql.comの公式担当者によって提供されるNodeのMysqljsパッケージの代替品です。

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

悪いことは、mysql誰もが慣れ親しんでいる古いパッケージを残していることです。

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

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

乾杯!


3
1年前の質問に対する詳細な回答を投稿していただきありがとうございます。:]
Daksh Gargas

3
いいですね、答えるだけではなく、実際にmysql_native_passwordを説明する答え
wizloc

1
はい、一度の適切な説明。よろしくお願いします。アプリを接続する方法では、ポート3306がMySQLに自動的に設定されませんでした。MySQLとMariaDBを3306から遠ざけるのに十分な問題があります。–
トランク

Oracleプラグインに注意してください。大きなペナルティが発生する可能性があります
。theregister.co.uk/ 2019/10/04

これは優れた回答であり、より多くの投票に値します!
6月

82

古い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_passwordMySQL 8.0で導入されたためですが、Node.jsバージョンはまだ実装されていません。詳細については、このプルリクエストこの問題をご覧ください。おそらく修正はすぐに来るでしょう!


魅力のように働きます。なんと安心したことでしょう。
帽子

@localhostと「ルート」だけを追加することの違いは何ですか
filemonczyk

クエリは機能します。しかし、それでもノードはMySQLサーバーに接続できませんでした。何か案が?エラーは次のとおりです{"code": "ER_ACCESS_DENIED_ERROR"、 "errno":1045、 "sqlMessage": "Access denied for user 'root' @ 'localhost'(using password:YES)"、 "sqlState": "28000" 、「致命的」:true}
Sanjay Pradeep

26

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

次に、ノードを使用して接続してみます


@sky詳細については、上記の私の回答を参照してください。
アイディン

1
@Aidinありがとう、とても役に立ちます。
Sky

17

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

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

2
:誰かがこのルートを行くことを望んでいる場合は、ここでいくつかの説明と記事のdigitalocean.com/community/tutorials/...
デヴィン

12

このエラーが発生したが、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

私はこれを使用しcommandていますがmysql、Node.jsで使用すると、サポートされていない認証エラーメッセージが表示されます
Juha Untinen

フルスタックトレースはここにある:pastebin.com/SzayQzdhドッキングウィンドウ-compose.ymlpastebin.com/7pUrWYDsエラー自体は次のとおりです。Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
ユハUntinen

1
@JuhaUntinenは、Dockerコンテナー(docker-composeによって作成されたコンテナー)とボリューム(〜/ Database / ORM_Test)を削除したことを確認してから、 'docker-compose up'を再度実行します。そうでない場合、「コマンド」からの変更は適用されません。それは私の場合に役立ちました。
Vitalii Ivanov

11

Mysql最新のDockerコンテナー内

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';

9

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

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

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

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

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

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

6)次に、Windowsインストーラーが示す手順を最後まで実行します。

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

MySQLとNode.jsの間の接続が機能するはずです。


4

MySQL 8.0ではcaching_sha2_password、デフォルトの認証プラグインではなくmysql_native_password. ...

この質問の答えのほとんどは、認証メカニズムをからcaching_sha2_passwordにダウングレードしmysql_native_passwordます。セキュリティの観点からは、これは非常に残念です。

このドキュメントcaching_sha2_passwordでは、認証方法をダウングレードすることを最初の選択肢にすべきではない理由とその理由について幅広く説明しています。

それで、アイディンの答えは受け入れられるべき答えであると私は信じています。認証方法をダウングレードする代わりに、サーバーのバージョンと一致するコネクタを使用してください。


3

ここで見つけることができる元のドキュメント: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);
  });

もっと複雑に見えますが、公式ガイドに従うべきだと思います!b
Juneyoung Oh

3

サーバーにMYSQLがあり、別のサーバーにnodejsアプリケーションがあります

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

mysql_native_password BY 'password'で識別されるALTER USER 'root' @ '%'


2

Windows 10 mysqlに既存のmysql 8.0をインストールする場合、

(1)インストーラーを起動し、

(2)(MySQLサーバーの左側にある)QuickActionの下の「再構成」をクリックし、

(3)[次へ]をクリックして、到着するまで次の2つの画面に進みます

(4)「認証方法」で「レガシー認証方法を使用する(MySQL 5.x互換性を維持する)」を選択します

(5)インストールが完了するまでクリックし続けます


2

MySQL 8以降では、新しいデフォルト認証はではcaching_sha2_passwordなくですmysql_native_password。新しい、より安全な認証方法は、ネイティブmysqlパッケージではまだサポートされていませんが、@mysql/xdevapi代わりにパッケージを使用することを検討してください。

新しいパッケージをインストールするには、次を実行:

npm install @mysql/xdevapi --save --save-exact

データベースに接続していくつかの値を挿入するには:

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

mysqlx
    .getSession({
        user: 'root',
        password: '*****',
        host: 'localhost',
        port: 33060
    })
    .then(function (session) {

    // Accessing an existing table
    myTable = session.getSchema('Database_Name').getTable('Table_Name');

    // Insert SQL Table data
    return myTable
        .insert(['first_name', 'last_name'])
        .values(['John', 'Doe'])
        .execute()
    });

公式パッケージのドキュメントは次の場所にあります:https : //dev.mysql.com/doc/dev/connector-nodejs/8.0/


2

あなたがドッカーを使っているなら、それは私のために働いた!

docker-compose.yml次の行を追加します。

mysql:
   ...    
   command: --default-authentication-plugin=mysql_native_password
   restart: always

その後down、コンテナとup


1

上記の回答に加えて、以下のコマンドを実行した後

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

次に、管理者としてcmdを試してください。コマンドでMySQLサーバーの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データベースに正常に接続できるはずです。お役に立てれば...



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

多くのことを試した後、これを理解しました。最後に私がしたことrequire('dotenv').config()は、.sequelizercファイルに追加することでした。どうやらsequelize-cliは環境変数を読みません。


0

ダウングレーディングは、次のような優れたオプションではない場合があります。

  1. 理由によりアップグレードされました(より良い認証を提供するため)。
  2. このような変更を行うための十分な権限がない可能性があります。

mysql2代わりにパッケージを使用できますmysql。主にmysqljsと互換性のあるAPI。また、サポートも約束されています。

次のように使用します。 const mysql = require('mysql2/promise')

詳しくは、httpsmysql2//www.npmjs.com/package/mysql2をご覧ください。

それが役に立てば幸い。:)


0

あなたはORM、ビルダーなどをスキップし、使用してDB / SQLの管理を簡素化することができます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');
});

-1

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

const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: ''
});

直面している問題の答えとして、直面している問題を追加しないでください
Aloy A Sen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.