# 自定义数据库函数模板

Authing 支持通过自定义数据库操作脚本的形式,连接开发者自己独立的数据库。我们支持包含 PostgresQL、MySQL、MongoDB、Sql Server 在内的主流数据库,同时你也可以选择不直接对外暴露数据库连接,而是封装接口提供给 Authing 服务器。如果你想将用户核心数据保存在自己的数据库,或者你的系统有一个旧有数据库,需要以不停机的形式惰性迁移到 Authing,可以实现这种方式。

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

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

Authing 提供以下自定义数据库操作脚本:

# 脚本执行

自定义数据库连接概述中所述,自定义数据库连接类型允许你配置操作脚本:与旧式身份存储库连接时使用。每个动作脚本本质上都是一个命名的 JavaScript 函数,该函数传递了许多参数,函数的名称和所传递的参数取决于脚本。

# 执行环境

对自定义数据库脚本的身份验证是在高度“安全,隔离的云环境上执行的,支持 JavaScript 的异步特性,并且你可以使用最新的async/await语法。

# Node 模块

你可以引入以下的 Node 模块:

示例:

const bcrypt = require(`bcrypt`);
const valid = await bcrypt.compare(`passw0rd`,user.password);

# UserPool 定义的环境变量

  • env.DB_CONNECTION_URI:你配置的数据库连接字符串,格式通常类似于postgres://postgres:postgres@localhost:5432/database-name
  • env.DB_HOSTenv.DB_PORTenv.DB_USERNAMEenv.DB_PASSWORDenv.DB_DATABASE:你拥有的数据库的数据库主机,端口,用户名,密码和数据库名称配置。
  • 其他你在 用户池 - 设置 - 环境变量 中配置的变量。

# 限制

Authing 自定义数据库脚本支持 JavaScript 的异步特性,并且可以使用诸如 Promise (opens new window),同时还支持 async/await语法。Authing 云环境通常具有 20 秒的执行限制,超时之后会回收资源。由于此限制而回收资源最终将导致返回错误情况。

# 完成脚本

你的脚本的返回值将作为和 Authing 服务器的约定,你需要按照约定返回特定格式的数据,否则可能会发生未知错误。操作脚本应在 return 语句后立即完成,并且应避免执行任何其他操作。

如果操作使用异步处理,则必须将对 return 语句的调用推迟到异步处理完成的位置(比如使用 await,在你的操作执行之前)。

同时请切记脚本执行完成时关闭到数据库的连接,比如调用 client.end(). 例如可以在 try/finallly 中执行确保其始终会被执行:

try {
  const result = await client.query("YOUR QUERY");
} finally {
  // NOTE: always call `client.end()` here to close the connection to the database
  client.end();
}