如何在 Self-Hosted Supabase 上配置 Asymmetric JWTs

发布: (2026年1月31日 GMT+8 03:19)
4 min read
原文: Dev.to

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

脚本:

  1. 生成公钥/私钥对(RS256 或 ES256)。
  2. 提示输入可选的 Key ID (kid),或创建一个随机的。
  3. 将密钥写入 JSON Web Key (JWK) 格式。
  4. 要求提供你现有的 ANON_KEYSERVICE_ROLE_KEY,并使用新密钥重新签名它们。

输出会提供以下环境变量。

环境变量

变量描述Supabase 服务 / 环境变量
JWT_SIGNING_KEYS私钥 + 公钥(JWK)GOTRUE_JWT_KEYS (auth service)
JWT_METHODS启用非对称算法(例如 RS256,ES256GOTRUE_JWT_VALID_METHODS (auth service)
JWT_JWKSJWK 格式的公钥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)。

验证设置

  1. 检查 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": "..."
        }
      ]
    }
  2. 检查用户 JWT

    • 从 HTTP 头或 Cookie 中提取 JWT。

    • 在 . 解码它。

    • 头部应包含:

      {
        "alg": "ES256",   // or "RS256"
        "typ": "JWT",
        "kid": "..."
      }
  3. 签名验证

    将公钥(JWKS JSON)粘贴到 jwt.io 的 “JWT Signature Verification” 部分,以确认签名能够正确验证。

Conclusion

您已经为自托管的 Supabase 部署配置了非对称 JWT 签名。这提升了安全性(私钥永不离开服务器),并且可以降低延迟,因为客户端可以使用缓存的 JWKS 在本地验证令牌。

随意调整脚本或 Kong 配置以匹配您的基础设施。祝自托管愉快!

Back to Blog

相关文章

阅读更多 »

什么是 JWT?

什么是 JWT?JWT(JSON Web Token)是一种类似小型数字密钥的令牌,由后端在用户登录后创建。它告诉服务器:“是的,这个用户已经……”。