Supabase Auth:身份链接、Hooks 和 HaveIBeenPwned 集成

2025-06-07

Supabase Auth:身份链接、Hooks 和 HaveIBeenPwned 集成

我们很高兴地宣布 Supabase Auth 的四个新功能:

  1. 身份链接
  2. 会话控制
  3. 密码保护泄露
  4. 带有 Postgres 函数的 Auth Hooks

身份链接

用户登录时,系统会使用身份验证方法和登录提供商创建一个身份。Supabase Auth一直以来都自动将身份与用户关联,前提是该身份与用户共享相同的已验证邮箱。这有利于消除用户账户重复。然而,一些开发者也需要能够灵活地关联不同邮箱的账户。

今天,我们推出了身份关联功能,开发者可以使用该功能手动关联两个不同的身份。我们新增了两个端点,方便开发者管理身份关联流程:

用户登录后,使用linkIdentity()链接OAuth 身份:

const { data, error } = await supabase.auth.linkIdentity({
  provider: 'google',
})
Enter fullscreen mode Exit fullscreen mode

用于unlinkIdentity()取消身份链接

// retrieve all identities linked to a user
const {
  data: { identities },
} = await supabase.auth.getUserIdentities()

// find the google identity linked to the user
const googleIdentity = identities.find(({ provider }) => provider === 'google')

// unlink the google identity from the user
const { data, error } = await supabase.auth.unlinkIdentity(googleIdentity)
Enter fullscreen mode Exit fullscreen mode

目前,这些方法支持关联 OAuth 身份。要将电子邮件或电话身份关联到用户,您可以使用updateUser()方法。

手动链接默认处于禁用状态。您可以在仪表盘的身份验证设置中为您的项目启用此功能。

如何启用手动链接

请参阅身份链接文档以了解更多信息。

会话控制

Supabase Auth 从用户登录应用程序的那一刻起,管理整个会话生命周期。这涉及以下步骤:

  1. 为用户创建会话。
  2. 刷新会话以使其保持活动状态。
  3. 到期或注销时撤销会话。

对于想要更好地控制用户会话的开发人员,我们公开了 3 个新设置:

  • 时间盒用户会话:强制用户在一定时间间隔后再次登录。
  • 不活动超时:如果用户在一定时间间隔内不活动,则强制用户再次登录。
  • 每个用户只能进行一次会话:限制用户只能进行一次会话。系统会保留最近活动的会话,并终止所有其他会话。

这些会话控制设置在 Pro 计划及以上版本中可用。

如何强制每个用户进行单个会话

有关详细信息,请参阅会话管理文档。

密码保护泄露

由于用户选择可猜测的密码或在不同平台上重复使用密码等常见行为,密码本质上是不安全的。

尽管 OAuth 和魔法链接更加安全,但我们认识到密码仍将存在。我们希望减少用户可能遇到的陷阱。为此,我们在 Supabase Auth 中集成了HaveIBeenPwned.org Pwned Passwords API,以防止用户使用泄露的密码。

Go 库
ℹ️ 我们开源了一个 Go 库,用于与我们在 Auth 服务器中使用的HaveIBeenPwned.org Pwned Passwords API 进行交互。查看代码库并随时贡献代码!

作为附加步骤,我们添加了为用户指定密码要求的功能。您可以在仪表板中的项目身份验证设置中进行配置:

添加密码要求

请参阅密码文档以了解更多信息。

身份验证钩子

我们收到了大量反馈,询问如何自定义 Auth,例如:

  • 向访问令牌 JWT 添加自定义声明
  • 多次 MFA 验证失败后注销用户
  • 对密码验证尝试应用自定义规则

我们致力于维护直观流畅的 Supabase Auth 体验。它应该能够轻松用于大多数开发者,无需任何自定义。然而,考虑到应用的多样性,您现在可以通过 Auth Hooks 扩展标准的 Auth 功能。

Auth Hooks 只是 Postgres 函数,它在 Auth 生命周期的关键点同步运行,以改变操作的结果。

例如,要使用 Auth Hooks 自定义 JWT 声明,您可以创建一个 Postgres 函数,该函数接受第一个参数中的 JWT 声明并返回您希望 Supabase Auth 使用的 JWT。

假设您正在创建一个游戏化应用程序,并且希望将用户的级别作为自定义声明附加到 JWT:

create function custom_access_token_hook(event jsonb)
returns jsonb
language plpgsql
as $$
declare
  user_level jsonb;
begin
  -- fetch the current user's level
  select
    to_jsonb(level) into user_level
  from profiles
  where
    user_id = event->>'user_id'::uuid;

  -- change the event.claims.level
  return jsonb_set(
        event,
        '{claims,level}',
        user_level);

end;
$$
Enter fullscreen mode Exit fullscreen mode

在数据库中创建函数后,您只需将其注册到 Supabase Auth:

身份验证钩子

目前,您可以为流程中的以下点注册 Auth Hook:

  • 自定义访问令牌:每次生成新的 JWT 时调用。
  • MFA 验证尝试:每次验证 MFA 因素时调用,允许更好地控制检测和阻止尝试。
  • 密码验证尝试:每次使用密码登录用户时调用,以便更好地控制用户帐户的安全性。

如果编写 PL/pgSQL 函数不是您的强项,您可以随时使用pg_net向后端 API 发送请求,或者使用plv8通过在 JavaScript 中编写函数来更轻松地操作 JSON。

Auth Hooks 现已开放自托管,并将于下个月正式上线平台。如果您需要尽快使用,请通过客服联系我们!

不仅如此!Postgres 函数并不是编写钩子的唯一方法。

Supabase 是Standard Webhooks的创始贡献者之一。Standard Webhooks 是一套开源工具和指南,旨在帮助您轻松、安全、可靠地发送和接收 webhook。Auth Hooks 也将于 2024 年第一季度支持 webhook。

还有一件事……

如果您从一开始就关注我们,您就会知道 Supabase Auth 最初是从Netlify 的 GoTrue 服务器fork 而来的。从那时起,很多事情发生了变化,我们也与上游代码库分道扬镳了。现阶段,将项目重命名为其他名称(鼓声响起)——Auth,是合理的。

这仅仅意味着存储库将从 using 重命名为gotrueauth不过不用担心!Docker 镜像和库@supabase/gotrue-js将继续发布,并且@supabase/auth-js只要当前 v2 版本仍受支持,您就可以互换使用。所有类和方法都保持不变。这里没有重大更改!

结论

感谢您阅读到最后!希望您喜欢 Supabase Auth 发布第 X 周的更新:身份链接、会话控制、密码泄露保护以及与 Postgres 函数的 Auth Hooks。

我们期待看到您使用这些新功能所构建的内容,当然也期待看到您的反馈,以使它们变得更好。

更多发布周 X

🚀 了解有关 Supabase 的更多信息

文章来源:https://dev.to/supabase/supabase-auth-identity-linking-hooks-and-haveibeenpwned-integration-19e1
PREV
Supabase Storage:现在支​​持 S3 协议
NEXT
Supabase AI助手v2