# 连接自定义数据库概览

只有企业版用户能够使用连接自定义数据库功能,详情请见 https://authing.cn/pricing (opens new window)。如果你想试用,请联系 15559944612 或 sales@authing.cn。

自定义数据库连接(以下会将此成为 Legacy Database)可以满足以下场景的需求:

  • 认证:把你的自定义数据库当作认证身份源,这种场景下,可以将 自定义数据库连接 当作和 OIDC IdP, SAML IdP, CAS IdP, Active Directory, Azure AD 同等的身份源(Identity Provider)
  • 迁移用户:这种迁移用户的模式称为惰性迁移(lazy migration),简单来说原理如下:最开始所有的原始用户数据在你的数据库,当用户第一次尝试在 Authing 登录时,Authing 会通过你配置的自定义数据库脚本在你的数据库查找并验证用户,如果成功,会将该用户迁移到 Authing 中;该用户第二次登录时,将使用 Authing 的数据库对其进行验证;当所有的用户都至少登录一次时,意味着迁移上云任务完成。详情请见:使用自定义数据库实现用户惰性迁移

你可以通过以下方式配置自定义数据库:前往 Authing 控制台 (opens new window)连接身份源 - 自定义数据库 页面开启自定义数据库连接,详情请见配置自定义数据库

# How it Works

如下图所示,你可以在 Authing 的认证流中自定义数据库从 Legacy Database 中获取用户的身份信息。取决于你所使用的场景,流程原理也会稍有不同。

自定义数据库有两种不同模式,你可以根据自己的业务需求选择合适的模式:

  • 惰性迁移用户:这种迁移用户的模式称为惰性迁移(lazy migration),简单来说原理如下:最开始所有的原始用户数据在你的数据库,当用户第一次尝试在 Authing 登录时,Authing 会通过你配置的自定义数据库脚本在你的数据库查找并验证用户,如果成功,会将该用户迁移到 Authing 中;该用户第二次登录时,将使用 Authing 的数据库对其进行验证;当所有的用户都至少登录一次时,意味着迁移上云任务完成。详情请见:使用自定义数据库实现用户惰性迁移 (opens new window)
  • 完全使用自定义数据库:这种模式下用户数据始终保存在你的数据库中,Authing 永远不会保存你的用户数据。为了让系统正常工作,你需要实现完整的用户增删改查脚本。

# 运行环境

目前 Authing 的自定义数据库脚本运行环境为 node 12 环境的完全隔离沙盒实例。

# npm 模块

包含各种数据库连接 Client、axios、bcrypt、lodash 等:

  • bcrypt (opens new window): 可用于加密和校验密码,这也是我们推荐的密码加密方式,使用起来也非常简单。示例:
const isPasswordValid = await bcrypt.compare(password, user.password)
if (!isPasswordValid) {
  throw new Error('密码错误')
}

# 全局变量 env

Authing 支持配置用户池级别的全局环境变量,添加方法请见配置环境变量,配置的所有环境变量可以通过全局变量 env.XXX 引用。同时在自定义数据库脚本中,还可以使用以下额外的环境变量:

  • env.DB_CONNECTION_URI: 数据库连接字符串,格式一般如 postgres://postgres:postgres@localhost:5432/database-name,你可以用其创建数据库连接实例,如下所示:
const { Client } = require('pg')

const client = new Client({
  connectionString: env.DB_CONNECTION_URI,
})
await client.connect()

  • env.DB_HOST: 数据库 Host。
  • env.DB_PORT: 数据库端口。
  • env.DB_USERNAME: 数据库用户名。
  • env.DB_PASSWORD: 数据库密码。
  • env.DB_DATABASE: 数据库名称。

你可以用其创建数据库连接实例,如下所示:

const { Client } = require('pg')
const client = new Client({
  host: env.DB_HOST,
  port: env.DB_PORT,
  user: env.DB_USERNAME,
  password: env.DB_PASSWORD,
  database: env.DB_DATABASE,
})
await client.connect()

# 添加 IP 白名单

如果你在脚本中访问的服务配置有防火墙,请确保其对以下 IP 地址开放:140.179.19.50, 52.80.250.250 . 你还可以通过以下 API 动态获取 Authing 服务器对外 IP 地址:https://core.authing.cn/api/v2/system/public-ips (opens new window)