从 Auth0 迁移到 Supabase Auth
了解如何将您的用户从 Auth0 迁移
您可以将您的用户从 Auth0 迁移到 Supabase Auth。
更改生产应用程序的身份验证提供程序是一项重要的操作。它可能会影响您应用程序的各个方面。提前做好准备,阅读本指南,并制定计划来处理关键的迁移步骤和可能出现的问题。
通过提前规划,可以实现平稳安全的身份验证迁移。
在您开始之前#
在开始之前,请考虑以下问题的答案。这将帮助您决定是否需要迁移,以及使用哪种策略
- 随着用户群的增长,身份验证提供商的成本如何扩展?
- 新的身份验证提供商是否提供了所有必需的功能?(例如,OAuth、密码登录、安全断言标记语言 (SAML)、多因素身份验证 (MFA))
- 迁移过程中是否可以接受停机时间?
- 在终止旧的身份验证提供商之前,您的迁移时间表是什么?
迁移策略#
根据您的评估,您可以选择以下策略之一
- 滚动迁移
- 一次性迁移
| 策略 | 优点 | 缺点 |
|---|---|---|
| 滚动 |
|
|
| 一次性 |
|
|
迁移步骤#
身份验证提供程序迁移需要 2 个主要步骤
- 从旧提供程序 (Auth0) 导出您的用户数据
- 将数据导入到新的提供程序 (Supabase Auth)
步骤 1:导出您的用户数据#
Auth0 提供了两种导出用户数据的方法
- 使用 Auth0 数据导出功能
- 使用 Auth0 管理 API。此端点有速率限制,因此您可能需要分批导出您的用户。
要导出密码哈希和 MFA 因素,请联系 Auth0 支持。
步骤 2:将您的用户导入 Supabase Auth#
导入用户的方法取决于您支持的登录方法。
请参阅以下部分,了解如何导入使用
基于密码的方法#
对于使用密码登录的用户,我们建议采用混合方法以减少停机时间
- 对于新用户,使用 Supabase Auth 进行注册。
- 以一次性迁移的方式迁移现有用户。
注册新用户
使用 Supabase Auth 的 signin 方法注册新用户。
将现有用户迁移到 Supabase Auth
将现有用户迁移到 Supabase Auth。这需要两个主要步骤:首先,检查需要迁移的用户,然后使用 Supabase 管理端点创建他们的帐户。
-
获取您的 Auth 0 用户导出和密码哈希导出列表。
-
筛选使用密码登录的用户。
- 在用户对象的
identities字段下,这些用户将具有auth0作为提供程序。在同一个身份对象中,您可以找到他们的 Auth0user_id。 - 通过将他们的 Auth0
user_id与密码哈希导出中的oid字段进行比较,检查用户是否具有相应的密码哈希。
- 在用户对象的
-
使用 Supabase Auth 的 admin create user 方法在 Supabase Auth 中重新创建用户。如果用户具有已确认的电子邮件地址或电话号码,请将
email_confirm或phone_confirm设置为true。1const { , } = await ...({2: 'valid.email@supabase.io',3: '$2y$10$a9pghn27d7m0ltXvlX8LiOowy7XfFw0hW0G80OjKYQ1jaoejaA7NC',4: true,5})支持的密码哈希算法
Supabase 支持 bcrypt 和 Argon2 密码哈希。
如果您有纯文本密码而不是哈希值,您可以提供该密码。Supabase Auth 将为您处理密码哈希。(密码始终以哈希方式存储。)
1const { , } = await ...({2: 'valid.email@supabase.io',3: 'supersecurepassword123!',4}) -
要登录您的迁移用户,请使用 Supabase Auth sign in 方法。
为了检查迁移用户不成功的情况,请使用回退策略。这确保了用户可以继续无缝登录
- 尝试使用 Supabase Auth 登录用户。
- 如果登录失败,请尝试使用 Auth0 登录。
- 如果 Auth0 登录成功,请再次调用 admin create user 方法在 Supabase Auth 中创建用户。
无密码方法#
对于通过电子邮件或电话进行的无密码登录,请检查具有已验证的电子邮件地址或电话号码的用户。使用 email_confirm 或 phone_confirm 设置为 true 在 Supabase Auth 中创建这些用户
1const { , } = await ...({2 : 'valid.email@supabase.io',3 : true,4})检查您的 Supabase Auth 电子邮件配置并配置您的 电子邮件模板以用于魔法链接。请参阅 电子邮件模板指南以了解更多信息。
导入用户后,您可以使用 signInWithOtp 方法登录他们。
OAuth#
通过遵循 社交登录指南在 Supabase 中配置您的 OAuth 提供程序。
对于新用户和现有用户,使用 signInWithOAuth 方法登录用户。这无需预先迁移现有用户,因为用户始终需要通过 OAuth 提供程序登录后才能重定向到您的服务。
用户成功完成 OAuth 流程后,您可以检查用户是否是 Auth0 中的新用户或现有用户,方法是将他们的社交提供程序 ID 映射到 Auth0。Auth0 将社交提供程序 ID 存储在用户 ID 中,格式为 provider_name|provider_id(例如,github|123456)。请参阅 Auth0 身份文档以了解更多信息。
Auth0 和 Supabase Auth 之间的映射#
每个身份验证提供程序都有其自己的模式来跟踪用户和用户信息。
在 Supabase Auth 中,您的用户存储在您项目的数据库的 auth 模式下。每个用户都有一个身份(除非用户是匿名用户),它代表他们可以使用 Supabase 登录的方法。这由 auth.users 和 auth.identities 表表示。
映射用户元数据和自定义声明#
Supabase Auth 提供了 2 个字段,您可以使用它们来映射来自 Auth0 的用户特定元数据
auth.users.raw_user_meta_data:用于存储用户可以更新的非敏感用户元数据(例如全名、年龄、喜欢的颜色)。auth.users.raw_app_meta_data:用于存储用户不应能够更新的非敏感用户元数据(例如定价计划、访问控制角色)。
这两个字段都可以从管理用户方法访问。要使用以下方法创建具有自定义元数据的用户
1const { , } = await ...({2 : 'valid.email@supabase.io',3 : {4 : 'Foo Bar',5 },6 : {7 : 'admin',8 },9})这些字段将在用户的访问令牌 JWT 中公开,因此建议不要将过多的元数据存储在这些字段中。
这些字段作为 jsonb 类型存储在 auth.users 表中的列中。可以使用管理 updateUserById 方法更新这两个字段。如果您希望用户更新他们自己的 raw_user_meta_data,可以使用 updateUser 方法。
如果您有大量的用户特定元数据要存储,建议在私有模式下创建自己的表,该表使用用户 ID 作为外键
1create table private.user_metadata (2 id int generated always as identity,3 user_id uuid references auth.users(id) on delete cascade,4 user_metadata jsonb5);