使用Sequelize连接MariaDB时auth_gssapi_client认证失败求助
Express + Sequelize 数据库连接认证协议错误排查与解决
问题现象
- 使用Sequelize连接MariaDB时,Express服务器启动失败,抛出认证协议不支持错误
- 直接通过
mariadb原生库配置连接时,数据库可正常连接 - 通过
.env+config.js+database.js的Sequelize配置方式启动后,8080端口无法访问,Postman请求被端口拒绝
报错信息
Unable to connect to the database: ConnectionError [SequelizeConnectionError]: (conn:3, no: 45025, SQLState: 08004) Client does not support authentication protocol 'auth_gssapi_client' requested by server. at ConnectionManager.connect (F:\Code\Web\apr-ts\backend\node_modules\sequelize\lib\dialects\mariadb\connection-manager.js:100:17) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async ConnectionManager._connect (F:\Code\Web\apr-ts\backend\node_modules\sequelize\lib\dialects\abstract\connection-manager.js:222:24) at async F:\Code\Web\apr-ts\backend\node_modules\sequelize\lib\dialects\abstract\connection-manager.js:174:32 { parent: SqlError: (conn:3, no: 45025, SQLState: 08004) Client does not support authentication protocol 'auth_gssapi_client' requested by server. at module.exports.createFatalError (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\misc\errors.js:90:10) at Authentication.pluginHandler (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\cmd\handshake\authentication.js:274:20) at Authentication.dispatchAuthSwitchRequest (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\cmd\handshake\authentication.js:242:36) at Authentication.handshakeResult (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\cmd\handshake\authentication.js:62:14) at Authentication.onPacketReceive (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\cmd\handshake\authentication.js:40:17) at PacketInputStream.receivePacketBasic (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\io\packet-input-stream.js:85:9) at PacketInputStream.onData (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\io\packet-input-stream.js:135:20) at Socket.emit (node:events:518:28) at addChunk (node:internal/streams/readable:559:12) at readableAddChunkPushByteMode (node:internal/streams/readable:510:3) { sqlMessage: "Client does not support authentication protocol 'auth_gssapi_client' requested by server.", sql: null, fatal: true, errno: 45025, sqlState: '08004', code: 'ER_AUTHENTICATION_PLUGIN_NOT_SUPPORTED' }, original: SqlError: (conn:3, no: 45025, SQLState: 08004) Client does not support authentication protocol 'auth_gssapi_client' requested by server. at module.exports.createFatalError (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\misc\errors.js:90:10) at Authentication.pluginHandler (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\cmd\handshake\authentication.js:274:20) at Authentication.dispatchAuthSwitchRequest (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\cmd\handshake\authentication.js:242:36) at Authentication.handshakeResult (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\cmd\handshake\authentication.js:62:14) at Authentication.onPacketReceive (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\cmd\handshake\authentication.js:40:17) at PacketInputStream.receivePacketBasic (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\io\packet-input-stream.js:85:9) at PacketInputStream.onData (F:\Code\Web\apr-ts\backend\node_modules\mariadb\lib\io\packet-input-stream.js:135:20) at Socket.emit (node:events:518:28) at addChunk (node:internal/streams/readable:559:12) at readableAddChunkPushByteMode (node:internal/streams/readable:510:3) { sqlMessage: "Client does not support authentication protocol 'auth_gssapi_client' requested by server.", sql: null, fatal: true, errno: 45025, sqlState: '08004', code: 'ER_AUTHENTICATION_PLUGIN_NOT_SUPPORTED' } }
已尝试操作
- 修改数据库用户认证插件:
ALTER USER 'your_username'@'your_host' IDENTIFIED VIA mysql_native_password USING PASSWORD('your_password'); FLUSH PRIVILEGES;
- 确认用户插件配置:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
- 验证原生
mariadb库连接正常:
const mariadb = require('mariadb'); const pool = mariadb.createPool({ host: 'your_host', user: 'your_username', password: 'your_password', database: 'your_database', connectionLimit: 5 }); async function connectDatabase() { let conn; try { conn = await pool.getConnection(); console.log("Connected to the database!"); } catch (err) { console.error("Unable to connect to the database:", err); } finally { if (conn) conn.release(); // release to the pool } } connectDatabase();
排查与解决建议
1. 强制Sequelize使用指定认证插件
在Sequelize连接配置中显式指定authPlugin,避免默认选择不兼容的认证协议:
const { Sequelize } = require('sequelize'); const config = require('./config'); const sequelize = new Sequelize(config.database, config.username, config.password, { host: config.host, dialect: 'mariadb', dialectOptions: { authPlugin: 'mysql_native_password' // 强制使用mysql_native_password认证 } });
2. 校验环境变量与配置传递
检查.env文件中的数据库参数是否与原生连接完全一致,避免大小写、空格或转义错误:
DB_HOST=your_host DB_USER=your_username DB_PASSWORD=your_password DB_NAME=your_database
确保config.js正确读取环境变量:
require('dotenv').config(); module.exports = { host: process.env.DB_HOST, username: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME };
3. 检查依赖版本兼容性
Sequelize与mariadb驱动版本不匹配可能导致认证逻辑异常,尝试锁定兼容版本:
# 安装稳定兼容版本 npm install sequelize@^6 mariadb@^3
4. 确保服务器在数据库连接成功后启动
数据库连接失败会导致Express服务器无法正常初始化,添加连接校验逻辑:
// database.js中添加连接测试 async function initDatabase() { try { await sequelize.authenticate(); console.log('数据库连接成功'); // 连接成功后启动服务器 require('./app').listen(8080, () => { console.log('服务器运行在8080端口'); }); } catch (error) { console.error('数据库连接失败:', error); process.exit(1); // 连接失败时退出进程,避免端口挂起 } } initDatabase();
5. 确认数据库用户主机权限
若用户host配置为localhost无法连接,尝试改为允许所有主机访问(生产环境需限制IP):
ALTER USER 'your_username'@'%' IDENTIFIED VIA mysql_native_password USING PASSWORD('your_password'); FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者luthfinzo
相关产品推荐
相关产品推荐

