mysql.connector で Authentication plugin ‘caching_sha2_password’ is not supported のエラー

PythonからMySQLに接続するのに便利な mysql.connector (mysql-connector-python) ですが、新規案件で使おうとしたところ「mysql.connector.errors.NotSupportedError: Authentication plugin 'caching_sha2_password' is not supported」とのエラーがでて作業中断…

読んだまま、caching_sha2_passwordという認証方式をサポートしていませんよということですが、今まで遭遇したことのないメッセージでなぜ?

原因

MySQL 8.0以降、認証方式のデフォルトがそのcaching_sha2_passwordに変更されているが、mysql.connectorがそれにまだ対応していないため。

解決策

認証方式を従来のmysql_native_passwordに戻して接続できるようにします。

まず、MySQL側の設定を変えます。MySQLサーバー全体の設定を変えることもできるようですが、せっかくMySQLさんがセキュリティに配慮してデフォルトを変えてくれているので、Pythonプログラムから接続するユーザーのみの最小限で設定変更してみます。

alter user 'yourname'@'%' identified with mysql_native_password by 'yourpassword';

MySQLに管理者でログインして、このコマンドでユーザーの認証方式(プラグイン)を変更します。yournameyourpasswordは適宜、変更してください。ユーザーにホストを指定している場合は、そのユーザーの%のところも変えます。

設定を変更できたか確認するには

select user, plugin from mysql.user where user='yourname';

とかで確認できます。

これでMySQL側の設定を変えたら、Pythonのコードを少しいじります。

conn = mysql.connector.connect(
    host="yourhost",
    port=3306,
    user="yourname",
    password="yourpassword",
    database="yourdb",
    auth_plugin="mysql_native_password"
)

ここはハマりました。

mysql.connector.connectはどうやらMySQLサーバー全体の設定の方の認証方式を試してしまうようなので、auth_pluginパラメーターで”mysql_native_password”を明示的に指定する必要があるようです。