创建并使用匿名用户通过 MemFire Cloud 进行身份验证
启用匿名登录功能可构建应用程序,为用户提供经过身份验证的体验,而无需用户输入电子邮件地址、密码、使用 OAuth 提供商或提供任何其他 PII(个人身份信息)。稍后,准备就绪后,用户可以将身份验证方法链接到其帐户。
匿名用户与匿名密钥
调用signInAnonymously()
会创建一个匿名用户。它就像永久用户一样,只是如果用户退出、清除浏览数据或使用其他设备,则无法访问其帐户。
与永久用户一样,authenticated
使用数据 API 访问您的项目时将使用 Postgres 角色。这些用户的 JWT 将具有声明is_anonymous
,您可以使用该声明在 RLS 策略中加以区分。
这与 API 密钥不同anon
,API 密钥不会创建用户,并且可用于实现对数据库的公共访问,因为它使用anonymous
Postgres 角色。
匿名登录可用于构建:
- 电子商务应用,例如结账前的购物车
- 全功能演示,不收集个人信息
- 临时或一次性帐户
在启用匿名登录之前,请检查您现有的 RLS 政策。匿名用户使用角色authenticated
。为了区分匿名用户和永久用户,您的政策需要检查is_anonymous
用户的 JWT 字段。
请参阅下文的访问控制部分以了解更多详细信息。
匿名登录
JavaScript
调用signInAnonymously()
方法:
await supabase.auth.signInAnonymously();
将匿名用户转换为永久用户#
将匿名用户转换为永久用户需要将身份与用户关联。这需要您在 MemFire Cloud 项目中启用手动关联。
链接电子邮件/电话身份#
JavaScript
您可以使用该updateUser()
方法将电子邮件或电话身份链接到匿名用户。
await supabase.auth.updateUser(UserAttributes(email: '[email protected]'));
链接 OAuth
JavaScript
您可以使用该linkIdentity()
方法将 OAuth 身份链接到匿名用户。
await supabase.auth.linkIdentity(OAuthProvider.google);
访问控制
匿名用户authenticated
就像永久用户一样承担该角色。您可以使用行级安全性 (RLS) 策略通过检查is_anonymous
返回的 JWT 中的声明来区分匿名用户和永久用户auth.jwt()
:
create policy "Only permanent users can post to the news feed"
on news_feed as restrictive for insert
to authenticated
with check ((select (auth.jwt()->>'is_anonymous')::boolean) is false );
create policy "Anonymous and permanent users can view the news feed"
on news_feed for select
to authenticated
using ( true );
使用限制性政策
RLS 策略默认为宽容型,这意味着当应用多个策略时,它们会使用“OR”运算符组合在一起。构建限制性策略非常重要,以确保在与其他策略组合时始终强制执行对匿名用户的检查。
解决身份冲突
根据您的应用程序要求,当匿名用户转换为永久用户时可能会出现数据冲突。例如,在电子商务应用程序的上下文中,匿名用户无需注册/登录即可将商品添加到购物车中。当他们决定登录现有帐户时,您需要决定如何解决购物车中的数据冲突:
- 使用现有帐户中的商品覆盖购物车中的商品
- 使用匿名用户的商品覆盖购物车中的商品
- 将购物车中的商品合并在一起
自动清理
目前无法自动清理匿名用户。不过,您可以通过运行以下 SQL 从项目中删除匿名用户:
-- 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';