用户认证

概述

每个认证系统都有两个部分。

  • 认证:这个人应该被允许进入吗?如果是的话,他们是谁?
  • 授权:一旦他们进入,他们被允许做什么?

Supabase Auth被设计为既可以作为一个独立的产品,也可以与其他Supabase产品深度集成。 Postgres是我们一切工作的核心,Auth系统也遵循这一原则。我们尽可能地利用Postgres的内置Auth功能。

下面是Supabase内置的Auth功能的2分钟快速浏览。

身份认证

你可以通过几种方式来验证你的用户。

  • 电子邮件和密码。
  • Magic links(一键登录)。
  • 社交媒体登录认证服务商。
  • 电话登录。

服务商

我们提供了多种认证方式和登录方式,以及认证工具集合。认证帮助程序

配置第三方服务商

你可以通过点击一个按钮来启用第三方提供商,方法是浏览认证 > 设置 > Auth Providers,并为每个提供商输入你的 客户端ID密匙

OAuth Logins.

重定向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' }

它是如何工作的

  1. 用户注册后。MemFireCloud在auth.users表中创建一个新用户。
  2. MemFireCloud返回一个包含用户UUID的新JWT。
  3. 每个对数据库的请求都会发送JWT。
  4. Postgres检查JWT以确定发起请求的用户。
  5. 用户的UID可以在策略中用于限制对行的访问。

MemFireCloud 在 Postgres 中提供了一个特殊函数 auth.uid() 。可以从JWT中提取用户的UID,在创建策略时特别有用。

用户管理

Supabase提供多个端点来验证和管理你的用户。

当用户注册时,Supabase为他们分配了一个唯一的ID。你可以在你的数据库中的任何地方引用这个ID。例如,你可以创建一个profiles表,使用user_id字段引用auth.users表中的id