You need to enable JavaScript to run this app.
文档中心
AI 原生 BaaS 平台 Supabase 版

AI 原生 BaaS 平台 Supabase 版

复制全文
下载 pdf
使用 Authentication
设置 Third-Party 登录
复制全文
下载 pdf
设置 Third-Party 登录
Third-Party Auth(第三方认证)允许 Supabase 信任由外部身份认证服务签发的 JWT,并将其用于访问 Supabase 的 Database、Storage、Realtime、Edge Function 等服务。本文介绍如何通过 Supabase 控制台和 Admin API 为应用配置 Third-Party Auth 登录能力。​
相关概念:详细原理与最佳实践可参考 Supabase 官方文档 Third-Party Auth。​
前提条件​
  • 已创建使用 Supabase 引擎的 Workspace,且 Workspace 状态为运行中。关于创建 Workspace 的更多详细信息,请参见创建 Workspace。​
  • 已通过目标 Workspace 成功登录 Supabase 控制台。关于登录控制台的详细信息,请参见登录 Supabase 控制台。​
  • 已获取 SUPABASE_BASE_URL、SERVICE_ROLE_KEY 和 SUPABASE_ANON_KEY。关于获取变量的详细信息,请参见获取变量。​
  • 已在第三方身份认证平台完成应用创建,并能获取对应的 Issuer URL 或 Provider 配置信息。​
  • 第三方身份认证平台签发的 JWT 需要满足以下要求:​
  • 使用非对称签名算法,推荐 RS256。​
  • JWT Header 中包含 kid。​
  • JWT Payload 中包含 role Claim,推荐值为 authenticated。如第三方 Token 默认不包含该 Claim,可通过 JWT Template、Trigger 或 Action 等方式补齐。​
  • JWT 的 iss、aud 等字段与第三方 Provider 配置保持一致。​
  • 已根据业务访问策略,为数据表、Storage 或 Realtime 配置对应的 RLS 策略,确保鉴权后的访问权限受控。​
使用流程​
Third-Party Auth 用于将 Supabase 的用户认证能力委托给第三方身份认证服务。整体流程如下:​
  1. 用户在第三方认证平台(如 Clerk、Firebase Auth)完成登录。​
  1. 业务应用获取第三方平台签发的 JWT。​
  1. 业务应用访问 Supabase 时,将该 JWT 作为 Authorization: Bearer <JWT> 传入。​
  1. Supabase 根据已配置的 Third-Party Auth 信息,拉取并校验第三方 Provider 的 JWKS 公钥。​
  1. 校验通过后,请求可访问 Supabase 的 Database、Storage、Realtime、Edge Function 等服务。​
支持的 Provider:​
当前支持以下主流身份认证服务,您可根据业务实际使用的认证平台选择对应配置方式:​
​
Provider​
配置依据​
说明​
Firebase Auth​
Firebase Project ID / Issuer URL​
适用于使用 Firebase Authentication 的应用。​
Clerk​
Clerk Domain / Issuer URL​
适用于使用 Clerk 管理用户登录的应用。​
WorkOS​
WorkOS Client ID / Issuer URL​
适用于使用 WorkOS User Management / SSO 的应用。​
Auth0​
Auth0 Tenant / Region / Issuer URL​
适用于使用 Auth0 作为认证服务的应用。​
AWS Cognito​
User Pool ID / Region / Issuer URL​
适用于使用 AWS Cognito 用户池的应用。​
自定义 JWKS ​
(Custom JWKS)​
kid / JWKS公钥​
​
适用于使用固定的 kid 和 JWKS 进行认证的应用。​
​
通过 Supabase 控制台配置​
通用步骤:添加 Third-Party Auth 配置​
  1. 在左侧导航栏中选择 Authentication。​
  1. 进入 Sign In / Providers 页面。​
  1. 在页面中找到 Third-Party Auth 配置区域。​
  1. 单击新增配置。​
  1. 选择需要接入的 Provider(如 Firebase Auth、Clerk 等)。​
  1. 填写对应 Provider 的 Issuer URL 或配置参数(详见下文各 Provider 子章节)。​
  1. 单击保存。​
保存后,系统会根据配置自动解析 Provider 类型,并拉取对应的 JWKS 公钥。配置成功后,页面或接口返回值会展示以下信息:​
  • 配置 ID​
  • Provider 类型​
  • OIDC Issuer URL​
  • 最近一次成功解析时间​
  • 已解析的公钥信息​
配置 Firebase Auth 认证​
Firebase Auth 的 Issuer URL 格式如下:​
​
https://securetoken.google.com/{project_id}​
​
其中 {project_id} 为 Firebase 项目的 Project ID。​
主要配置项说明:​
​
Dashboard 配置项名称​
配置项 Key​
配置项 Value 类型​
是否必填​
配置项说明​
OIDC Issuer URL​
oidc_issuer_url​
string​
是​
Firebase Auth 的 Issuer URL。​
Project ID​
project_id​
string​
是​
Firebase 项目的 Project ID。​
​
Firebase 端配置要求:需在 Firebase 中为用户 Token 增加自定义 Claim:​
需要在 Firebase 中为用户 Token 增加自定义 Claim:​
​
{​
"role": "authenticated"​
}​
​
可通过 Firebase Cloud Functions 或 Admin SDK 设置该 Claim。​
配置 Clerk 认证​
Clerk 的 Issuer URL 通常为 Clerk 实例域名,例如:​
​
https://better-kitten-86.clerk.accounts.dev​
​
主要配置项说明:​
​
Dashboard 配置项名称​
配置项 Key​
配置项 Value 类型​
是否必填​
配置项说明​
OIDC Issuer URL​
oidc_issuer_url​
string​
是​
Clerk 实例的 Issuer URL。​
Domain​
domain​
string​
是​
Clerk 实例的域名。​
​
Clerk 端配置要求:需确保 Session Token 包含以下 Claim:​
需要在 Clerk 中确保 Session Token 包含以下 Claim:​
​
{​
"role": "authenticated"​
}​
​
可通过 Clerk 的 JWT Template 或 Supabase 集成配置补齐该 Claim。业务应用初始化 Supabase Client 时,需要通过 accessToken 回调传入 Clerk 签发的 Token。​
配置 WorkOS 认证​
WorkOS 的 Issuer URL 格式如下:​
​
https://api.workos.com/user_management/{client_id}​
​
其中 {client_id} 为 WorkOS 应用的 Client ID。​
主要配置项说明:​
​
Dashboard 配置项名称​
配置项 Key​
配置项 Value 类型​
是否必填​
配置项说明​
OIDC Issuer URL​
oidc_issuer_url​
string​
是​
WorkOS 的 Issuer URL。​
Client ID​
client_id​
string​
是​
WorkOS 应用 Client ID。​
​
WorkOS 端配置要求:需在 WorkOS JWT Template 中增加 role Claim,例如:​
需要在 WorkOS JWT Template 中增加 role Claim,例如:​
​
{​
"role": "authenticated"​
}​
​
配置 Auth0 认证​
Auth0 的 Issuer URL 格式如下:​
​
https://{tenant}.{region}.auth0.com​
​
如果 Auth0 租户不使用区域域名,则以实际 Auth0 控制台展示的 Domain 为准。​
主要配置项说明:​
​
Dashboard 配置项名称​
配置项 Key​
配置项 Value 类型​
是否必填​
配置项说明​
OIDC Issuer URL​
oidc_issuer_url​
string​
是​
Auth0 的 Issuer URL。​
Tenant​
tenant​
string​
是​
Auth0 Tenant。​
Region​
region​
string​
否​
Auth0 Region,按实际域名填写。​
​
Auth0 端配置要求:需通过 Auth0 Action 为 Token 增加 role Claim,例如:​
需要通过 Auth0 Action 为 Token 增加 role Claim,例如:​
​
exports.onExecutePostLogin = async (event, api) => {​
api.idToken.setCustomClaim('role', 'authenticated')​
}​
​
配置 AWS Cognito 认证​
AWS Cognito 的 Issuer URL 格式如下:​
​
https://cognito-idp.{region}.amazonaws.com/{user_pool_id}​
​
主要配置项说明:​
​
Dashboard 配置项名称​
配置项 Key​
配置项 Value 类型​
是否必填​
配置项说明​
OIDC Issuer URL​
oidc_issuer_url​
string​
是​
Cognito 用户池 Issuer URL。​
Region​
region​
string​
是​
AWS Region。​
User Pool ID​
user_pool​
string​
是​
Cognito User Pool ID。​
​
AWS Cognito 端配置要求:需通过 Pre Token Generation Trigger 为 Token 增加 role Claim,例如:​
需要通过 Pre Token Generation Trigger 为 Token 增加 role Claim,例如:​
​
export const handler = async (event) => {​
event.response = {​
claimsOverrideDetails: {​
claimsToAddOrOverride: {​
role: 'authenticated'​
}​
}​
}​
return event​
}​
​
配置自定义 JWKS(Custom JWKS)认证​
除了标准的 OIDC Issuer,您还可以使用自定义 JWKS。该方式适用于使用固定 kid 和 JWKS 公钥进行认证的应用,配置格式如下:​
​
{​
"custom_jwt_secret": {​
"kid": "{kid}",​
"algorithm": "{algorithm}",​
"public_key": "{public_key}"​
}​
}​
​
主要配置项说明:​
​
Dashboard 配置项名称​
配置项 Key​
配置项 Value 类型​
是否必填​
配置项说明​
Key ID (kid)​
kid​
string​
是​
自定义 JWKS 的 kid,注意这个 kid 必须实例内唯一。​
Algorithm​
algorithm​
string​
是​
目前仅支持 RS256/PS256。​
Public Key​
public_key​
string​
是​
自定义公钥,后续的 JWT 会使用该公钥解密。​
​
通过 Admin API 配置​
您也可以通过 Auth 模块的 Admin API /auth/v1/config/third-party-auth 接口管理 Third-Party Auth 配置,便于自动化部署或集成到 CI/CD 流程。​
查询配置列表​
​
curl -X GET "$SUPABASE_BASE_URL/auth/v1/config/third-party-auth" \​
-H "apikey: ${SERVICE_ROLE_KEY}" \​
-H "Authorization: Bearer ${SERVICE_ROLE_KEY}" \​
-H "Content-Type: application/json"​
​
返回示例:​
​
[​
{​
"id": "48156a14-4883-4f91-aa3e-e57b6fb267f4",​
"type": "clerk",​
"oidc_issuer_url": "https://better-kitten-86.clerk.accounts.dev",​
"resolved_at": "2026-03-20T15:29:51.535299+08:00",​
"resolved_jwks": {​
"keys": [​
{​
"alg": "RS256",​
"kid": "ins_xxx",​
"kty": "RSA",​
"use": "sig"​
}​
]​
},​
"inserted_at": "2026-03-20T15:29:51.535299+08:00",​
"updated_at": "2026-03-20T15:29:51.535299+08:00"​
}​
]​
​
新增配置​
​
curl -X POST "$SUPABASE_BASE_URL/auth/v1/config/third-party-auth" \​
-H "apikey: ${SERVICE_ROLE_KEY}" \​
-H "Authorization: Bearer ${SERVICE_ROLE_KEY}" \​
-H "Content-Type: application/json" \​
-d '{​
"oidc_issuer_url": "https://better-kitten-86.clerk.accounts.dev"​
}'​
​
返回示例:​
​
{​
"id": "48156a14-4883-4f91-aa3e-e57b6fb267f4",​
"type": "clerk",​
"oidc_issuer_url": "https://better-kitten-86.clerk.accounts.dev",​
"resolved_at": "2026-03-20T07:29:51.53529971Z",​
"resolved_jwks": {​
"keys": [​
{​
"alg": "RS256",​
"kid": "ins_xxx",​
"kty": "RSA",​
"use": "sig"​
}​
]​
},​
"inserted_at": "2026-03-20T07:29:51.53529971Z",​
"updated_at": "2026-03-20T07:29:51.53529971Z"​
}​
​
删除配置​
​
curl -X DELETE "$SUPABASE_BASE_URL/auth/v1/config/third-party-auth/{resource_id}" \​
-H "apikey: ${SERVICE_ROLE_KEY}" \​
-H "Authorization: Bearer ${SERVICE_ROLE_KEY}" \​
-H "Content-Type: application/json"​
​
其中 {resource_id} 为查询配置列表或新增配置时返回的 id。​
手动同步 Third-Party 公钥​
系统会每隔 30 分钟自动刷新第三方 Provider 的公钥。如需在 JWKS 轮转后立即生效,可调用以下接口手动同步:​
​
curl -X GET "$SUPABASE_BASE_URL/auth/v1/config/third-party-auth/sync" \​
-H "apikey: ${SERVICE_ROLE_KEY}" \​
-H "Authorization: Bearer ${SERVICE_ROLE_KEY}" \​
-H "Content-Type: application/json"​
​
在业务应用中使用 Third-Party Token​
配置完成后,业务应用需要在初始化 Supabase Client 时传入第三方认证服务签发的 JWT。​
说明​
以下示例中的 thirdPartyAuthClient 代表业务应用中使用的第三方认证 Client,不是 Supabase Client 的 Auth 对象。在实际接入时,请替换为业务应用使用的 Clerk、Firebase Auth、Auth0、WorkOS、AWS Cognito 或自定义的第三方认证 SDK Client。关键点是 accessToken 回调函数必须返回第三方 Provider 签发的有效 JWT。​
JavaScript / TypeScript 示例​
​
import { createClient } from '@supabase/supabase-js'​
​
const supabase = createClient(​
'https://<supabase-project>.supabase.co',​
'<SUPABASE_ANON_KEY>',​
{​
accessToken: async () => {​
// 从第三方认证 Client 获取 JWT​
return await thirdPartyAuthClient.getToken()​
},​
}​
)​
​
之后访问 Supabase 时,客户端会自动携带:​
​
Authorization: Bearer <third-party-jwt>​
​
接入示例​
场景一:通过 Firebase Auth 接入​
完整示例可参考 Supabase 官方文档:Third-Party Auth — Firebase Auth。​
场景二:通过 Clerk 接入​
完整示例可参考 Supabase 官方文档:Third-Party Auth — Clerk。​
场景三:通过 WorkOS 接入​
完整示例可参考 Supabase 官方文档:Third-Party Auth — WorkOS。​
场景四:通过 Auth0 接入​
完整示例可参考 Supabase 官方文档:Third-Party Auth — Auth0。​
场景五:通过 AWS Cognito 接入​
完整示例可参考 Supabase 官方文档:Third-Party Auth — AWS Cognito。​
场景六:通过自定义 JWKS 接入​
步骤 1:准备 JWKS(私钥和公钥)。如尚未生成,可参考以下示例:​
​
WORKDIR="${WORKDIR:-/tmp/custom_jwt_material}"​
mkdir -p "$WORKDIR"​
​
PRIVATE_KEY="$WORKDIR/private.pem"​
PUBLIC_KEY="$WORKDIR/public.pem"​
​
openssl genrsa -out "$PRIVATE_KEY" 2048 >/dev/null 2>&1​
openssl rsa -in "$PRIVATE_KEY" -pubout -out "$PUBLIC_KEY" >/dev/null 2>&1​
​
安全提示​
请谨慎保管您的私钥,切勿上传至公网或任何可能泄漏的位置。​
步骤 2:在 Supabase 控制台配置自定义 JWK Provider,填入 kid、algorithm、public_key:​
  • ​​​
  • ​​​
步骤 3:生成业务侧 JWT。注意 KID / ALG 必须与第二步配置保持一致,且 ROLE 不能为 service_role:​
​
KID="${KID:-custom-test-kid-1}"​
ALG="${ALG:-RS256}"​
SUB="${SUB:-test-user}"​
ISS="${ISS:-custom-third-auth-test}"​
ROLE="${ROLE:-authenticated}"​
EXP_SECONDS="${EXP_SECONDS:-360000}"​
​
python3 - "$PRIVATE_KEY" "$JWT_FILE" "$KID" "$ALG" "$SUB" "$ISS" "$ROLE" "$EXP_SECONDS" <<'PY'​
import base64​
import json​
import subprocess​
import sys​
import time​
​
private_key = sys.argv[1]​
jwt_file = sys.argv[2]​
kid = sys.argv[3]​
alg = sys.argv[4]​
sub = sys.argv[5]​
iss = sys.argv[6]​
role = sys.argv[7]​
exp_seconds = int(sys.argv[8])​
​
def b64url(data: bytes) -> str:​
return base64.urlsafe_b64encode(data).rstrip(b"=").decode()​
​
header = {​
"alg": alg,​
"typ": "JWT",​
"kid": kid,​
}​
payload = {​
"iss": iss,​
"sub": sub,​
"role": role,​
"iat": int(time.time()),​
"exp": int(time.time()) + exp_seconds,​
}​
​
header_b64 = b64url(json.dumps(header, separators=(",", ":")).encode())​
payload_b64 = b64url(json.dumps(payload, separators=(",", ":")).encode())​
signing_input = f"{header_b64}.{payload_b64}".encode()​
​
proc = subprocess.run(​
["openssl", "dgst", "-sha256", "-sign", private_key],​
input=signing_input,​
capture_output=True,​
check=True,​
)​
sig_b64 = b64url(proc.stdout)​
jwt = f"{header_b64}.{payload_b64}.{sig_b64}"​
​
with open(jwt_file, "w", encoding="utf-8") as f:​
f.write(jwt)​
​
print(jwt)​
PY​
​
步骤 4:在业务应用中使用该 JWT 访问 Supabase 服务。​
注意事项与限制​
  • 配额限制:每个 Supabase Branch 最多可配置 10 个 Third-Party Auth Provider。​
  • 公钥刷新:Supabase 后台每 30 分钟自动刷新一次 Third-Party Auth Provider 的公钥。​
  • JWKS 轮转:如果 Third-Party Auth Provider 的 JWKS 已发生轮转,建议立即调用手动同步公钥接口,确保新的 JWKS 尽快生效。​
  • 客户端凭据:不建议使用 SERVICE_ROLE_KEY 作为客户端访问凭据。客户端应使用 SUPABASE_ANON_KEY 初始化 Supabase Client,并通过 accessToken 回调传入第三方 JWT。​
  • role Claim 校验:Third-Party JWT Payload 中必须包含 role Claim,推荐值为 authenticated。如果 role 的值为 service_role,请求会被直接拒绝。​
  • 删除影响:删除某个 Third-Party Auth Provider 后,使用该 Provider JWT 的请求将立即被 Supabase 拒绝。​
  • 创建参数互斥:在创建单个 Provider 时,参数 oidc_issuer_url 和 custom_jwt_secret 只能选择其中一种。前者创建支持自动轮转的标准三方 JWKS,后者创建自定义 JWKS。​
  • 自定义 JWKS 安全建议:建议定期轮转自定义 JWKS 私钥,降低由于私钥泄漏带来的安全风险。Supabase 不会自动刷新自定义 JWKS 的公钥,请由业务方自行管理其有有效期。​
最近更新时间:2026.05.22 15:40:10
这个页面对您有帮助吗?
有用
有用
无用
无用