如何在 Self-Hosted Supabase 上配置 Asymmetric JWTs
I’m ready to translate the article, but I need the text you’d like translated. Could you please paste the content of the post (or the portion you want translated) here? I’ll keep the source link exactly as you provided and translate the rest into Simplified Chinese while preserving all formatting.
介绍
自托管 Supabase 可让您完全掌控生产环境,但官方文档侧重于托管服务。开源版本中未充分覆盖的一个功能是 非对称 JWT 签名(RSA 或 ECC)。本指南将演示如何在自托管的 Supabase 堆栈上配置非对称 JWT。
前置条件
- 一个运行中的自托管 Supabase 实例(docker‑compose)。
- 访问每个 Supabase 服务的
docker‑compose.yml文件。 - 可选:使用 Dokploy 进行更简便的部署(示例使用 Dokploy 模板)。
生成非对称密钥
一个小脚本会创建密钥对,将其格式化为 JWK,并准备好你需要的环境变量。
curl -sL https://gist.githubusercontent.com/vpcano/28e93b8af3cb36ba3ecd9a397ccf0ab7/raw/33a2769ac9d2ff0b8fa953566ee1fd5a773ec159/supabase-keygen.sh | bash
脚本:
- 生成公钥/私钥对(RS256 或 ES256)。
- 提示输入可选的 Key ID (kid),或创建一个随机的。
- 将密钥写入 JSON Web Key (JWK) 格式。
- 要求提供你现有的
ANON_KEY和SERVICE_ROLE_KEY,并使用新密钥重新签名它们。
输出会提供以下环境变量。
环境变量
| 变量 | 描述 | Supabase 服务 / 环境变量 |
|---|---|---|
JWT_SIGNING_KEYS | 私钥 + 公钥(JWK) | GOTRUE_JWT_KEYS (auth service) |
JWT_METHODS | 启用非对称算法(例如 RS256,ES256) | GOTRUE_JWT_VALID_METHODS (auth service) |
JWT_JWKS | JWK 格式的公钥 | PGRST_JWT_SECRET, PGRST_APP_SETTINGS_JWT_SECRET (REST), API_JWT_JWKS (Realtime), JWT_JWKS (Storage) |
ANON_KEY / SERVICE_ROLE_KEY | 在所有服务和客户端应用中替换之前的密钥 | – |
将这些变量添加到 docker‑compose.yml 的相应部分,例如:
services:
auth:
environment:
- GOTRUE_JWT_KEYS=${JWT_SIGNING_KEYS}
- GOTRUE_JWT_VALID_METHODS=${JWT_METHODS}
rest:
environment:
- PGRST_JWT_SECRET=${JWT_JWKS}
- PGRST_APP_SETTINGS_JWT_SECRET=${JWT_JWKS}
realtime:
environment:
- API_JWT_JWKS=${JWT_JWKS}
storage:
environment:
- JWT_JWKS=${JWT_JWKS}
通过 Kong 暴露 JWKS 端点
公共 JWKS 端点 (/auth/v1/.well-known/jwks.json) 必须在不进行身份验证的情况下可访问。编辑挂载在 Kong 容器中的 Kong 配置文件 (kong.yml)。
services:
## Open Auth routes
- name: auth-v1-open-jwks
url: http://auth:9999/.well-known/jwks.json
routes:
- name: auth-v1-open-jwks
strip_path: true
paths:
- /auth/v1/.well-known/jwks.json
plugins:
- name: cors
## Secure Auth routes
# ... (other services)
更新 kong.yml 后,重新启动所有 Supabase 容器(或运行 docker compose up -d --force-recreate)。
验证设置
-
检查 JWKS 端点
访问
https:///auth/v1/.well-known/jwks.json。你应该看到类似的 JSON:{ "keys": [ { "alg": "ES256", "crv": "P-256", "key_ops": ["verify"], "kid": "...", "kty": "EC", "use": "sig", "x": "...", "y": "..." } ] } -
检查用户 JWT
-
从 HTTP 头或 Cookie 中提取 JWT。
-
在 . 解码它。
-
头部应包含:
{ "alg": "ES256", // or "RS256" "typ": "JWT", "kid": "..." }
-
-
签名验证
将公钥(JWKS JSON)粘贴到 jwt.io 的 “JWT Signature Verification” 部分,以确认签名能够正确验证。
Conclusion
您已经为自托管的 Supabase 部署配置了非对称 JWT 签名。这提升了安全性(私钥永不离开服务器),并且可以降低延迟,因为客户端可以使用缓存的 JWKS 在本地验证令牌。
随意调整脚本或 Kong 配置以匹配您的基础设施。祝自托管愉快!