平台

从 Auth0 迁移到 Supabase Auth

了解如何将您的用户从 Auth0 迁移


您可以将您的用户从 Auth0 迁移到 Supabase Auth。

更改生产应用程序的身份验证提供程序是一项重要的操作。它可能会影响您应用程序的各个方面。提前做好准备,阅读本指南,并制定计划来处理关键的迁移步骤和可能出现的问题。

通过提前规划,可以实现平稳安全的身份验证迁移。

在您开始之前#

在开始之前,请考虑以下问题的答案。这将帮助您决定是否需要迁移,以及使用哪种策略

  • 随着用户群的增长,身份验证提供商的成本如何扩展?
  • 新的身份验证提供商是否提供了所有必需的功能?(例如,OAuth、密码登录、安全断言标记语言 (SAML)、多因素身份验证 (MFA))
  • 迁移过程中是否可以接受停机时间?
  • 在终止旧的身份验证提供商之前,您的迁移时间表是什么?

迁移策略#

根据您的评估,您可以选择以下策略之一

  1. 滚动迁移
  2. 一次性迁移
策略优点缺点
滚动
  • 零停机时间
  • 用户可能需要重新登录
  • 需要在短期内维护 2 个不同的身份验证服务,这可能会增加成本
  • 需要在迁移期间维护单独的代码路径
  • 一些现有的用户可能不活跃,并且尚未使用新的提供程序登录。这意味着您最终需要回填这些用户。但是,这是一种规模较小的一次性迁移,风险较低,因为这些用户不活跃。
一次性
  • 无需长时间维护 2 个不同的身份验证服务
  • 一些停机时间
  • 用户需要重新登录。对活跃用户有风险。

迁移步骤#

身份验证提供程序迁移需要 2 个主要步骤

  1. 从旧提供程序 (Auth0) 导出您的用户数据
  2. 将数据导入到新的提供程序 (Supabase Auth)

步骤 1:导出您的用户数据#

Auth0 提供了两种导出用户数据的方法

  1. 使用 Auth0 数据导出功能
  2. 使用 Auth0 管理 API。此端点有速率限制,因此您可能需要分批导出您的用户。

要导出密码哈希和 MFA 因素,请联系 Auth0 支持。

步骤 2:将您的用户导入 Supabase Auth#

导入用户的方法取决于您支持的登录方法。

请参阅以下部分,了解如何导入使用

基于密码的方法#

对于使用密码登录的用户,我们建议采用混合方法以减少停机时间

  1. 对于新用户,使用 Supabase Auth 进行注册。
  2. 以一次性迁移的方式迁移现有用户。
注册新用户

使用 Supabase Auth 的 signin 方法注册新用户。

将现有用户迁移到 Supabase Auth

将现有用户迁移到 Supabase Auth。这需要两个主要步骤:首先,检查需要迁移的用户,然后使用 Supabase 管理端点创建他们的帐户。

  1. 获取您的 Auth 0 用户导出和密码哈希导出列表。

  2. 筛选使用密码登录的用户。

    • 在用户对象的 identities 字段下,这些用户将具有 auth0 作为提供程序。在同一个身份对象中,您可以找到他们的 Auth0 user_id
    • 通过将他们的 Auth0 user_id 与密码哈希导出中的 oid 字段进行比较,检查用户是否具有相应的密码哈希。
  3. 使用 Supabase Auth 的 admin create user 方法在 Supabase Auth 中重新创建用户。如果用户具有已确认的电子邮件地址或电话号码,请将 email_confirmphone_confirm 设置为 true

    1
    const { , } = await ...({
    2
    : 'valid.email@supabase.io',
    3
    : '$2y$10$a9pghn27d7m0ltXvlX8LiOowy7XfFw0hW0G80OjKYQ1jaoejaA7NC',
    4
    : true,
    5
    })

    如果您有纯文本密码而不是哈希值,您可以提供该密码。Supabase Auth 将为您处理密码哈希。(密码始终以哈希方式存储。)

    1
    const { , } = await ...({
    2
    : 'valid.email@supabase.io',
    3
    : 'supersecurepassword123!',
    4
    })
  4. 要登录您的迁移用户,请使用 Supabase Auth sign in 方法

    为了检查迁移用户不成功的情况,请使用回退策略。这确保了用户可以继续无缝登录

    1. 尝试使用 Supabase Auth 登录用户。
    2. 如果登录失败,请尝试使用 Auth0 登录。
    3. 如果 Auth0 登录成功,请再次调用 admin create user 方法在 Supabase Auth 中创建用户。

无密码方法#

对于通过电子邮件或电话进行的无密码登录,请检查具有已验证的电子邮件地址或电话号码的用户。使用 email_confirmphone_confirm 设置为 true 在 Supabase Auth 中创建这些用户

1
const { , } = 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.usersauth.identities 表表示。

请参阅 用户身份部分以了解更多信息。

映射用户元数据和自定义声明#

Supabase Auth 提供了 2 个字段,您可以使用它们来映射来自 Auth0 的用户特定元数据

  • auth.users.raw_user_meta_data:用于存储用户可以更新的非敏感用户元数据(例如全名、年龄、喜欢的颜色)。
  • auth.users.raw_app_meta_data:用于存储用户不应能够更新的非敏感用户元数据(例如定价计划、访问控制角色)。

这两个字段都可以从管理用户方法访问。要使用以下方法创建具有自定义元数据的用户

1
const { , } = await ...({
2
: 'valid.email@supabase.io',
3
: {
4
: 'Foo Bar',
5
},
6
: {
7
: 'admin',
8
},
9
})

这些字段作为 jsonb 类型存储在 auth.users 表中的列中。可以使用管理 updateUserById 方法更新这两个字段。如果您希望用户更新他们自己的 raw_user_meta_data,可以使用 updateUser 方法

如果您有大量的用户特定元数据要存储,建议在私有模式下创建自己的表,该表使用用户 ID 作为外键

1
create 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 jsonb
5
);

常见问题解答 (FAQ)#

有用的参考资料#