认证

Amazon Cognito (Amplify)

在Supabase项目中使用通过Amplify或独立部署的Amazon Cognito


Amazon Cognito 用户池(通过 AWS Amplify 或独立使用)可以作为第三方认证提供商与 Supabase Auth 配合使用,或独立应用于您的 Supabase 项目。

开始使用

  1. 首先需要添加集成来连接您的 Supabase 项目与 Amazon Cognito 用户池。您需要获取用户池的 ID 和所在区域。
  2. 在项目的认证设置中添加新的第三方认证集成,或通过 CLI 进行配置。
  3. 使用预令牌生成触发器(Pre-Token Generation Trigger)为所有 JWT 分配 role: 'authenticated' 自定义声明。
  4. 最后在您的应用程序中设置 Supabase 客户端。

设置 Supabase 客户端库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import { fetchAuthSession, Hub } from 'aws-amplify/auth'const supabase = createClient('https://<supabase-project>.supabase.co', 'SUPABASE_ANON_KEY', { accessToken: async () => { const tokens = await fetchAuthSession() // 也可以使用 tokens?.idToken 替代 return tokens?.accessToken },})// 如果使用 Realtime 功能,还需要设置 Cognito 认证变更的监听器Hub.listen('auth', () => { fetchAuthSession().then((tokens) => supabase.realtime.setAuth(tokens?.accessToken))})

为项目添加新的第三方认证集成

在仪表板中导航至项目的认证设置,找到"第三方认证"部分来添加新的集成。

在CLI中,将以下配置添加到您的supabase/config.toml文件:

1
2
3
4
[auth.third_party.aws_cognito]enabled = trueuser_pool_id = "<id>"user_pool_region = "<region>"

使用预生成令牌触发器分配认证角色

您的Supabase项目会检查所有发送给它的JWT中的role声明,以便在使用数据API、存储或实时授权时分配正确的Postgres角色。

默认情况下,Amazon Cognito的JWT(包括ID令牌和访问令牌)不包含role声明。如果向您的Supabase项目发送此类JWT,在执行Postgres查询时将分配anon角色。而您应用的大部分逻辑应该由authenticated角色访问。

推荐的做法是配置一个预生成令牌触发器,可以是V1_0(仅ID令牌)或V2_0(访问令牌和ID令牌)。为此,您需要创建一个新的Lambda函数(可使用任何语言和运行时),并将其分配给Amazon Cognito用户池的Lambda触发器配置。例如,Lambda函数应类似如下:

1
2
3
4
5
6
7
8
9
10
11
export const handler = async (event) => { event.response = { claimsOverrideDetails: { claimsToAddOrOverride: { role: 'authenticated', }, }, } return event}