Clerk
在Supabase项目中使用Clerk
Clerk 可以作为第三方认证提供者与 Supabase Auth 配合使用,也可以独立用于您的 Supabase 项目。
开始使用
入门非常简单。首先访问 Clerk 的 Connect with Supabase 页面 配置您的 Clerk 实例以兼容 Supabase。
最后在 Supabase 仪表盘中 添加一个新的 Clerk 第三方认证集成。
配置本地开发或自托管环境
当使用 Supabase CLI 进行本地开发或自托管时,将以下配置添加到您的 supabase/config.toml
文件中:
123[auth.third_party.clerk]enabled = truedomain = "example.clerk.accounts.dev"
您仍然需要配置 Clerk 实例以兼容 Supabase。
手动配置 Clerk 实例
如果无法使用 Clerk 的 Connect with Supabase 页面 来配置 Clerk 实例以与 Supabase 协同工作,请按照以下步骤操作。
- 通过 自定义会话令牌 将
role
声明添加到 Clerk 会话令牌 中。已认证的终端用户应将该声明的值设为authenticated
。如果您有高级的 Postgres 设置,其中已认证的终端用户使用不同的 Postgres 角色访问数据库,请调整该值以使用正确的角色名称。 - 一旦您的实例中所有 Clerk 会话令牌都包含
role
声明,即可按照上述说明在 Supabase 仪表盘中 添加一个新的 Clerk 第三方认证集成,或在 CLI 中注册。
设置 Supabase 客户端库
123456789const supabaseClient = createClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, { // Session accessed from Clerk SDK, either as Clerk.session (vanilla // JavaScript) or useSession (React) accessToken: async () => session?.getToken() ?? null, } )
使用 RLS 策略
配置 Supabase 客户端库使用 Clerk 会话令牌后,您可以使用 RLS (行级安全) 策略来保护对项目数据库、存储对象和实时通道的访问。
与 Clerk 配合设计 RLS 策略的推荐方式是使用 Clerk 会话令牌中的声明(claims)来控制对项目数据的访问权限。请查阅 Clerk 文档了解可用的 JWT 声明及其值。
示例:检查用户组织角色
123456789create policy "Only organization admins can insert in table"on secured_tablefor insertto authenticatedwith check ( (((select auth.jwt()->>'org_role') = 'org:admin') or ((select auth.jwt()->'o'->>'rol') = 'admin')) and (organization_id = (select coalesce(auth.jwt()->>'org_id', auth.jwt()->'o'->>'id'))));
这个 RLS 策略会检查新插入表中的行是否在 organization_id
列中包含用户声明的组织 ID。此外,它还确保用户是 org:admin
角色。
通过这种方式,只有组织管理员才能为他们所属的组织向表中添加行。
示例:检查用户是否通过二次因素验证
12345678create policy "Only users that have passed second factor verification can read from table"on secured_tableas restrictivefor selectto authenticatedusing ( ((select auth.jwt()->'fva'->>1) != '-1'));
此示例使用严格的RLS策略检查fva
声明中的二次因素验证年龄元素是否为'-1'
,表明用户已通过二次因素验证。
已弃用的JWT模板集成
自2025年4月1日起,先前提供的Clerk与Supabase集成被视为已弃用,不再推荐使用。所有使用已弃用集成的项目在至少2026年1月1日前将免除第三方月活跃用户(TP-MAU)费用。
该集成使用了Supabase和Clerk中仍可用的底层原语,例如可配置的JWT密钥和Clerk的JWT模板。这使得您可以非正式地继续使用它,但Supabase仅提供有限支持。
弃用原因如下: