自托管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客户端配置
- 创建并配置客户端:
- 登录Keycloak本地控制台(
http://localhost:8080),进入目标Realm,点击「Clients」→「Create client」 - 客户端类型选「OpenID Connect」,填写客户端ID(如
supabase),开启「Client authentication」,点击「Next」 - 开启「Authorization」,完成客户端创建
- 登录Keycloak本地控制台(
- 关键回调URI配置:
- 在客户端设置的「Valid redirect URIs」中添加:
http://localhost:54321/auth/v1/callback(Supabase Auth的固定回调地址)http://localhost:3000/*(Next.js前端的回调地址,若前端端口不同需对应修改)
- 「Web origins」设置为
http://localhost:3000(允许前端跨域请求)
- 在客户端设置的「Valid redirect URIs」中添加:
- 其他必要设置:
- 「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
相关产品推荐
相关产品推荐

