# 自定义数据库函数模板
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 模块:
pg
(opens new window)bcrypt
(opens new window)axios
(opens new window)lodash
(opens new window)mongodb
(opens new window)mysql2
(opens new window)mysql2/promise
(opens new window)
示例:
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_HOST
,env.DB_PORT
,env.DB_USERNAME
,env.DB_PASSWORD
,env.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();
}