Supabase Auth 现已支持匿名登录

2025-06-10

Supabase Auth 现已支持匿名登录

Supabase Auth 现在支持匿名登录,这是社区最需要的功能之一。

⚡️ 了解更多关于 GA 周的信息

匿名登录可用于创建尚未注册您应用的临时用户。由于新用户无需提供任何注册凭证,因此可以降低他们试用产品的门槛。

启用匿名登录

现在可以从仪表板为您的项目启用匿名登录:

启用功能截图

对于本地开发,请升级您的 Supabase CLI 并将配置添加到config.toml文件中:

[auth]
enable_anonymous_sign_ins = true

Enter fullscreen mode Exit fullscreen mode

您现在可以通过JavascriptFlutterSwift SDK创建匿名用户。以下是使用 创建匿名用户 的步骤supabase-js

const { data, error } = await supabase
  .auth
  .signInAnonymously()
Enter fullscreen mode Exit fullscreen mode

术语

使用匿名登录创建的个人资料也是如此authenticated

一旦您拨打电话,.signInAnonymously()您就将用户移入身份验证流程,我们会将他们视为已登录用户:

示例图

限制匿名用户的访问

与永久用户一样,匿名用户也会保留在auth.users表中:

ID 角色 电子邮件 是匿名的
e053e470-afa1-4625-8963-37adb862fd11 已认证 无效的 真的
5563108e-ac81-4063-9288-4f3db068efa1 已认证 luke@starwars.com 错误的

匿名用户可以通过is_anonymous用户 JWT 中返回的声明进行识别,该声明可通过行级安全策略 (RLS) 访问。如果您想限制对应用程序中某些功能的访问权限,这将非常有用。

例如,假设我们有一个在线论坛,用户可以在其中创建和阅读帖子。

给出此表来存储帖子:

create table public.posts (
  id serial primary key,
  name text not null,
  description text
);
Enter fullscreen mode Exit fullscreen mode

如果我们只想允许永久用户创建帖子,我们可以通过检查 JWT 来检查用户是否是匿名的select auth.jwt() ->> 'is_anonymous'

在 RLS 策略中使用此函数:

create policy "Only permanent users can create posts"
on public.posts
for insert
to authenticated -- Note: user is still authenticated
with check (
  (select auth.jwt() ->> 'is_anonymous')::boolean is false
);

Enter fullscreen mode Exit fullscreen mode

RLS 使我们能够充分灵活地创建各种规则。

例如,允许永久用户读取所有帖子,并限制匿名用户只能读取今天创建的帖子:

create policy "Limit access to anonymous users"
on public.posts
for select
to authenticated -- Note: user is still authenticated
using (
  case
    when (select (auth.jwt() ->> 'is_anonymous'))::boolean is true
    then (created_at >= current_date)
  else
    true
  end
);
Enter fullscreen mode Exit fullscreen mode

将匿名用户转换为永久用户

某个时候,匿名用户可能会想要创建帖子。这时,我们会提示他们注册一个账户,并将其转换为永久用户。

匿名用户如果拥有与其关联的身份,则被视为永久用户。
转换后,用户 ID 保持不变,这意味着与该用户 ID 关联的任何数据都将被转移。

Supabase Auth 提供了两种方法来实现这一点:

1- 链接电子邮件或电话身份
2- 链接 OAuth 身份

链接电子邮件或电话身份

要链接电子邮件或电话身份:

const { data, error } = await supabase
  .auth
  .updateUser({ email })
Enter fullscreen mode Exit fullscreen mode

链接 OAuth 身份

要将 OAuth 身份关联到匿名用户,您需要为项目启用手动关联。了解Supabase Auth 的身份关联功能。

开启

一旦启用,您可以调用该linkIdentity()方法:

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

冒充匿名用户

创建 RLS 策略以区分匿名用户的访问权限时,您可以利用SQL 编辑器中的用户模拟功能来测试您的策略:

助手截图

SQL 编辑器中的数据库角色设置。您可以通过从下拉列表中选择用户来模拟匿名用户。

用户管理屏幕提供了按匿名用户过滤的选项,这有助于了解已创建了多少个匿名用户。

工具截图

下一步

管理匿名用户可能比较棘手,尤其是在您的网站访客众多的情况下。我们正在开发一个“自动清理”选项,用于删除超过 30 天处于非活动状态的匿名用户。与此同时,由于匿名用户存储在数据库的 auth 架构中,您可以通过运行以下查询来清理孤立的匿名用户:

-- deletes anonymous users created more than 30 days ago
delete from auth.users
where is_anonymous is true and created_at < now() - interval '30 days';

Enter fullscreen mode Exit fullscreen mode

我们还在开发一个linter来检查您的 RLS 政策并突出显示那些允许匿名用户访问的政策 - 请继续关注本月晚些时候的更新!

入门

更多关于 GA 周的信息

鏂囩珷鏉ユ簮锛�https://dev.to/supabase/supabase-auth-now-supports-anonymous-sign-ins-1j00
PREV
Supabase Bootstrap:启动新项目的最快方式
NEXT
pgvector 0.6.0:并行索引构建速度提高 30 倍