Amazon Cognito (Amplify)
在Supabase项目中使用通过Amplify或独立部署的Amazon Cognito
Amazon Cognito 用户池(通过 AWS Amplify 或独立使用)可以作为第三方认证提供商与 Supabase Auth 配合使用,或独立应用于您的 Supabase 项目。
开始使用
- 首先需要添加集成来连接您的 Supabase 项目与 Amazon Cognito 用户池。您需要获取用户池的 ID 和所在区域。
- 在项目的认证设置中添加新的第三方认证集成,或通过 CLI 进行配置。
- 使用预令牌生成触发器(Pre-Token Generation Trigger)为所有 JWT 分配
role: 'authenticated'
自定义声明。 - 最后在您的应用程序中设置 Supabase 客户端。
设置 Supabase 客户端库
123456789101112131415import { 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
文件:
1234[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函数应类似如下:
1234567891011export const handler = async (event) => { event.response = { claimsOverrideDetails: { claimsToAddOrOverride: { role: 'authenticated', }, }, } return event}