You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Auth0与MySQL 8数据库集成遇认证协议兼容问题求助

解决Auth0与MySQL集成时的ER_NOT_SUPPORTED_AUTH_MODE错误

问题背景

将Auth0与自建MySQL数据库集成时,使用Auth0自定义DB脚本连接数据库触发错误:

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

已尝试修改本地及Auth0出站IP对应的MySQL用户认证方式为mysql_native_password、切换脚本使用mysql2库,但问题未解决。

针对性解决方案

1. 覆盖Auth0所有出站IP的用户授权

Auth0自定义DB脚本的出站IP并非单一地址,仅授权单个IP无法覆盖所有请求场景:

  • 登录Auth0控制台,进入Authentication > Database > 目标连接 > Settings > IP Addresses,获取全部允许的出站IP列表
  • 为每个IP创建对应MySQL用户并配置mysql_native_password认证:
    CREATE USER 'auth0_user'@'具体出站IP' IDENTIFIED WITH mysql_native_password BY '你的密码';
    GRANT SELECT, INSERT, UPDATE ON 你的数据库名.用户表名 TO 'auth0_user'@'具体出站IP';
    FLUSH PRIVILEGES;
    
  • 测试环境可临时使用通配符简化配置(生产环境不建议):
    CREATE USER 'auth0_user'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
    GRANT SELECT, INSERT, UPDATE ON 你的数据库名.用户表名 TO 'auth0_user'@'%';
    FLUSH PRIVILEGES;
    

2. 修改MySQL默认认证插件配置

即便单独修改用户认证方式,MySQL全局默认插件仍可能为caching_sha2_password,导致新连接使用不兼容协议:

  • 编辑MySQL配置文件(Linux为/etc/my.cnf//etc/mysql/my.cnf,Windows为my.ini)
  • 添加或修改配置项:
    [mysqld]
    default_authentication_plugin = mysql_native_password
    
  • 重启MySQL服务使配置生效

3. 完善Auth0脚本的mysql2连接配置

使用mysql2库时需显式指定认证插件,避免自动选择不兼容协议:

const mysql = require('mysql2/promise');

async function login(email, password) {
  // 建立数据库连接
  const connection = await mysql.createConnection({
    host: '你的MySQL服务器地址',
    user: 'auth0_user', // 对应授权的用户名
    password: '你的密码',
    database: '你的数据库名',
    authPlugins: {
      mysql_native_password: require('mysql2/lib/auth/native_password')
    }
  });

  try {
    // 查询用户记录
    const [rows] = await connection.execute('SELECT id, nickname, email, password FROM 用户表名 WHERE email = ?', [email]);
    if (rows.length === 0) throw new Error('用户不存在');

    const user = rows[0];
    // 验证密码(注意:生产环境必须使用哈希密码验证,如bcrypt,禁止明文比对)
    if (password !== user.password) throw new Error('密码错误');

    // 返回符合Auth0格式的用户数据
    return {
      user_id: `auth0|${user.id}`,
      email: user.email,
      nickname: user.nickname
    };
  } finally {
    await connection.end();
  }
}

4. 验证用户认证方式生效

执行以下SQL查询,确认目标用户的认证插件为mysql_native_password:

SELECT user, host, plugin FROM mysql.user WHERE user = 'auth0_user';

需确保所有Auth0出站IP对应的host条目,plugin字段均为mysql_native_password。

Auth0自定义DB登录模板说明(翻译自官方文档)

Auth0自定义数据库连接允许将现有MySQL数据库作为身份源,登录脚本需实现核心逻辑:

  1. 根据用户输入的邮箱/唯一标识查询数据库中的用户记录
  2. 验证用户输入的凭证(密码)与数据库存储的凭证匹配(强烈建议存储哈希后的密码,禁止明文存储)
  3. 返回符合Auth0格式的用户数据,必须包含user_id、email字段,可选nickname等字段

内容的提问来源于stack exchange,提问作者mikeyMike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:00:56