用户认证
概述
每个认证系统都有两个部分。
- 认证:这个人应该被允许进入吗?如果是的话,他们是谁?
- 授权:一旦他们进入,他们被允许做什么?
Supabase Auth被设计为既可以作为一个独立的产品,也可以与其他Supabase产品深度集成。 Postgres是我们一切工作的核心,Auth系统也遵循这一原则。我们尽可能地利用Postgres的内置Auth功能。
下面是Supabase内置的Auth功能的2分钟快速浏览。
身份认证
你可以通过几种方式来验证你的用户。
- 电子邮件和密码。
- Magic links(一键登录)。
- 社交媒体登录认证服务商。
- 电话登录。
服务商
我们提供了多种认证方式和登录方式,以及认证工具集合。认证帮助程序。
配置第三方服务商
你可以通过点击一个按钮来启用第三方提供商,方法是浏览认证 > 设置 > Auth Providers,并为每个提供商输入你的 客户端ID
和 密匙
。
重定向URLs和通配符#
当使用第三方提供商时,Supabase客户端库将用户重定向到提供商。当第三方服务商成功认证用户时,服务商将用户重定向到Supabase Auth回调URL,在那里他们将被进一步重定向到redirectTo
参数中指定的URL。这个参数默认为SITE_URL
。你可以修改SITE_URL
或添加额外的重定向URL。
你可以使用通配符匹配模式来支持Netlify和Vercel等服务商的预览URL。见支持模式的完整列表。
Netlify预览URLs
对于使用Netlify的部署,将SITE_URL
设置为你的官方网站URL。为本地开发和部署预览添加以下额外的重定向URL。
http://localhost:3000/*/*
https://**--my_org.netlify.app/*
Vercel预览网址
对于使用Vercel的部署,将SITE_URL
设置为你的官方网站URL。为本地开发和部署预览添加以下额外的重定向URL。
http://localhost:3000/*/*
https://**vercel.app/*/*
Vercel为部署的URL提供了一个环境变量,称为NEXT_PUBLIC_VERCEL_URL
。更多细节见Vercel docs。你可以使用这个变量,根据环境动态地重定向。
1const { data, error } = await supabase.auth.signInWithOAuth({
2 provider: 'github'
3 options: {
4 redirectTo: process.env.NEXT_PUBLIC_VERCEL_URL
5 ? `https://${process.env.NEXT_PUBLIC_VERCEL_URL}`
6 : "http://localhost:3000"
7 }
8}
移动端深层链接 URI
对于移动应用程序,您可以使用深度链接URI。例如,对于您的SITE_URL
,您可以指定类似于com.supabase://login-callback/
的内容,如果需要额外的重定向URL,则可以使用类似于com.supabase.staging://login-callback/
的内容。
授权
当你需要细化的授权规则时,没有什么比PostgreSQL的行级安全(RLS)更重要了。
策略是PostgreSQL的规则引擎。它们是非常强大和灵活的,允许你编写复杂的SQL规则,以满足你独特的业务需求。
从我们的行级安全指南开始吧。
行级安全
认证只解决了用户身份验证的问题,但并没有涉及用户在系统中的权限和访问级别。为了解决这个问题,您需要使用到PostgreSQL的行级安全性(RLS)的特性。该特性通过打开和关闭RLS选项,使得授权变得非常简单。
策略
策略是PostgreSQL的规则引擎。它们非常强大和灵活,允许你编写复杂的SQL规则,以适应你独特的业务需求。
如果设置了策略(Policy),你的数据库就成了规则引擎。就不需要编写如下复杂的查询语句:
1const loggedInUserId = 'd0714948' 2let { data, error } = await supabase 3 .from('users') 4 .select('user_id, name') 5 .eq('user_id', loggedInUserId) 6 7// console.log(data) 8// => { id: 'd0714948', name: 'Jane' }
你可以很方便的在数据库表上定义一个策略(policy),auth.uid() = user_id
,策略生效后,你对数据库的所有请求仅返回将通过该策略的行记录,即:只能查询到当前登录用户的数据,简化代码如下:
1let { data, error } = await supabase.from('users').select('user_id, name') 2 3// console.log(data) 4// Still => { id: 'd0714948', name: 'Jane' }
它是如何工作的
- 用户注册后。MemFireCloud在
auth.users
表中创建一个新用户。 - MemFireCloud返回一个包含用户
UUID
的新JWT。 - 每个对数据库的请求都会发送JWT。
- Postgres检查JWT以确定发起请求的用户。
- 用户的UID可以在策略中用于限制对行的访问。
MemFireCloud 在 Postgres 中提供了一个特殊函数 auth.uid()
。可以从JWT中提取用户的UID,在创建策略时特别有用。
用户管理
Supabase提供多个端点来验证和管理你的用户。
当用户注册时,Supabase为他们分配了一个唯一的ID。你可以在你的数据库中的任何地方引用这个ID。例如,你可以创建一个profiles
表,使用user_id
字段引用auth.users
表中的id
。