You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自托管Supabase与Keycloak集成报错,求Docker-Compose及客户端配置

自托管Supabase与Keycloak认证错误解决配置方案

该错误(Unable+to+exchange+external+code:+6c4407d3-17ca-44c9-bf9c-c659a0f52e40.51dee7bb-fedb-4799-acd3-d9cfba80f36e.a2f16c7a-e0eb-46bd-9f69-9deb84df9113)通常由OAuth回调URI不匹配、provider参数配置错误或容器网络互通问题导致,以下是完整配置方案:

一、Keycloak OAuth客户端配置

  • 创建并配置客户端:
    1. 登录Keycloak本地控制台(http://localhost:8080),进入目标Realm,点击「Clients」→「Create client」
    2. 客户端类型选「OpenID Connect」,填写客户端ID(如supabase),开启「Client authentication」,点击「Next」
    3. 开启「Authorization」,完成客户端创建
  • 关键回调URI配置:
    1. 在客户端设置的「Valid redirect URIs」中添加:
      • http://localhost:54321/auth/v1/callback(Supabase Auth的固定回调地址)
      • http://localhost:3000/*(Next.js前端的回调地址,若前端端口不同需对应修改)
    2. 「Web origins」设置为http://localhost:3000(允许前端跨域请求)
  • 其他必要设置:
    • 「Access Type」选择「confidential」
    • 「Standard Flow Enabled」设为On
    • 切换到「Credentials」标签页,复制生成的「Client secret」,后续Supabase配置需要用到

二、Supabase Docker Compose配置调整

修改docker-compose.yml,给supabase-auth服务添加Keycloak相关环境变量,并确保容器网络互通:

# 先添加自定义网络(若已有可忽略)
networks:
  supabase-network:
    driver: bridge

services:
  # 其他服务配置保留,修改supabase-auth部分
  supabase-auth:
    environment:
      # 原有环境变量不变,新增以下Keycloak配置
      - GOTRUE_EXTERNAL_KEYCLOAK_ENABLED=true
      - GOTRUE_EXTERNAL_KEYCLOAK_CLIENT_ID=supabase # 对应Keycloak客户端ID
      - GOTRUE_EXTERNAL_KEYCLOAK_CLIENT_SECRET=你的Keycloak客户端密钥 # 替换为实际复制的密钥
      - GOTRUE_EXTERNAL_KEYCLOAK_REDIRECT_URI=http://localhost:54321/auth/v1/callback
      - GOTRUE_EXTERNAL_KEYCLOAK_BASE_URL=http://keycloak:8080/realms/你的Realm名称 # 用容器名访问Keycloak,需确保Keycloak容器名为keycloak
      - GOTRUE_EXTERNAL_KEYCLOAK_AUTH_URI=/protocol/openid-connect/auth
      - GOTRUE_EXTERNAL_KEYCLOAK_TOKEN_URI=/protocol/openid-connect/token
      - GOTRUE_EXTERNAL_KEYCLOAK_USER_INFO_URI=/protocol/openid-connect/userinfo
    networks:
      - supabase-network

  # 若Keycloak也在同一docker-compose中,需添加其配置并加入同一网络
  keycloak:
    image: quay.io/keycloak/keycloak:latest
    command: start-dev
    environment:
      - KEYCLOAK_ADMIN=admin
      - KEYCLOAK_ADMIN_PASSWORD=admin
    ports:
      - "8080:8080"
    networks:
      - supabase-network

三、Next.js示例验证配置

  • 项目根目录的.env.local文件配置:
NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=你的Supabase匿名密钥 # 可在Supabase控制台→API页面获取
  • 登录调用代码示例:
import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'

const supabase = createClientComponentClient()

const handleKeycloakLogin = async () => {
  await supabase.auth.signInWithOAuth({
    provider: 'keycloak',
    options: {
      redirectTo: 'http://localhost:3000/auth/callback' // 需匹配Keycloak中设置的前端回调URI
    }
  })
}

额外排查要点

  • 确认Keycloak容器正常运行,可通过http://localhost:8080访问控制台
  • 检查Supabase Auth日志:执行docker logs supabase-auth,查看详细错误输出定位问题
  • 确保所有容器都加入了同一Docker网络,避免跨网络访问失败

内容的提问来源于stack exchange,提问作者Law

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:27:34