中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【node.js】MySQL8.0に接続できない。Error: ER_NOT_SUPPORTED_AUTH_MODE

1.概要

node.jsのパッケージ【mysql】を使って
MySQL8.0に接続しようとすると下記のエラーが発生しました。

error connecting: Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

内容は

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

という内容です。


このエラーの原因について調べてみました。


2.エラーの原因

原因はMySQL8.0から採用された認証プラグインが原因のようです。
MySQL5.7までは【mysql_native_password】だったのですが
MySQL8.0からは【caching_sha2_password】が採用されています。

名前のとおりSHA-256を使ったパスワードの暗号化です。


MySQLで確認してみると

mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
| testuser         | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)

のように認証プラグインが【caching_sha2_password】になっています。


node.jsのパッケージである【mysql】はこれに対応していない為エラーが発生したようです。
ちなみに【mysql】のバージョンは【2.18.1】の最新版でしたがうまくいきませんでした。

3.解決方法

①認証プラグインの変更

【caching_sha2_password】を【mysql_native_password】に変えてしまえという発想です。
方法としては下記のコマンドを実行すればいいようです。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';


ただこの方法で解決するのは嫌だったので、他の解決方法を探してみました。

②【mysql2】を使う

なんとmysql2というのがあるみたいです。
これは何なのかというと、以下に記載がありました。
github.com


要約すると

mysql2はmysqljs/mysqlを作っていたチームと協力して作り直したもの
互換性もあるしこれからも機能追加を行っていく
とのこと

どうやら今後を見越して【mysql2】を使った方がよさそうです。

ということでパッケージを追加して

>npm install mysql2

動作確認を行うと、【caching_sha2_password】の状態でも
無事に接続できることが確認出来ました。

バージョンは【2.1.0】になります。