配置社交登录(OAuth)提供商
Set up social login (OAuth/OIDC) providers for self-hosted Supabase with Docker.
本指南介绍了在使用 Docker Compose 运行的自托管 Supabase 实例上启用社交登录提供商所需的服务器端配置。这适用于所有基于 OAuth 和 OIDC 的提供商,包括像 Keycloak 这样的第三方身份提供商。
🌐 This guide covers the server-side configuration required to enable social login providers on a self-hosted Supabase instance running with Docker Compose. This applies to all OAuth and OIDC-based providers, including third-party identity providers like Keycloak.
在你开始之前 #
🌐 Before you begin
你需要:
🌐 You need:
- 一个可用的自托管 Supabase 安装。请参阅 使用 Docker 自托管。
API_EXTERNAL_URL设置为你 Supabase 实例的可公开访问的 URL(例如,https://<your-domain>/auth/v1)。
大多数 OAuth 提供商都要求使用 HTTPS —— http:// 回调 URL 会被拒绝(localhost 除外)。请参阅 HTTPS 操作指南 获取设置说明。
🌐 HTTPS is required by most OAuth providers - http:// callback URLs are rejected (except localhost). See the HTTPS how-to guide for setup instructions.
你的 OAuth 回调 URL 应该看起来像下面这样:
🌐 Your OAuth callback URL should look like the following:
1https://<your-domain>/auth/v1/callback你需要在每个 OAuth 提供商那里注册这个 URL。
🌐 You will have to register this URL with each OAuth provider.
OAuth 请求流程 #
🌐 OAuth request flow
当用户使用 OAuth 提供商登录时,会发生以下流程:
🌐 When a user signs in with an OAuth provider, the following flow occurs:
- 你的应用调用了
supabase.auth.signInWithOAuth(),然后浏览器会重定向到认证服务 - API 网关会将请求路由到 Auth 容器(
/auth/v1/authorize) - Auth 会将用户重定向到 OAuth 提供商(例如 Google)以获取同意
- 提供商会重定向回
https://<your-domain>/auth/v1/callback - Auth 用授权码换取令牌,然后将用户重定向到你的
SITE_URL或允许的重定向 URL
认证环境变量 #
🌐 Auth environment variables
Auth 服务(GoTrue)在所有 OAuth 配置中都会使用前缀 GOTRUE_EXTERNAL_,后面跟上提供商的名称。例如,使用 Google 时:
🌐 The Auth service (GoTrue) uses the prefix GOTRUE_EXTERNAL_ followed by a provider name for all OAuth configuration. For example, when using Google:
GOTRUE_EXTERNAL_GOOGLE_ENABLEDGOTRUE_EXTERNAL_GOOGLE_CLIENT_IDGOTRUE_EXTERNAL_GOOGLE_SECRETGOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI
逐步配置 #
🌐 Step-by-step configuration
默认的 .env.example 和 docker-compose.yml 包含为 Google、GitHub 和 Azure 注释掉的占位符。
🌐 The default .env.example and docker-compose.yml include commented-out placeholders for Google, GitHub, and Azure.
第一步:在提供商那里注册你的应用 #
🌐 Step 1: Register your app with the provider
- 去 OAuth 提供商的开发者控制台创建一个应用吧。
- 设置授权重定向 URL,例如
https://<your-domain>/auth/v1/callback - 把客户端ID和客户端密钥复制到你的
.env文件里。
步骤 2:配置环境变量 #
🌐 Step 2: Configure environment variables
取消注释 .env 中你提供商的行,并添加你的客户端 ID 和密钥,例如,对 Google:
🌐 Uncomment the lines for your provider in .env and add your client ID and secret, e.g., for Google:
1GOOGLE_ENABLED=true2GOOGLE_CLIENT_ID=your-client-id3GOOGLE_SECRET=your-client-secret步骤 3:在 Docker Compose 配置中启用匹配的行 #
🌐 Step 3: Enable the matching lines in Docker Compose configuration
取消注释 auth 服务的 environment 中相应的 GOTRUE_EXTERNAL_ 行:
🌐 Uncomment the corresponding GOTRUE_EXTERNAL_ lines in the auth service's environment:
1auth:2 environment:3 # ... existing variables ...4 GOTRUE_EXTERNAL_GOOGLE_ENABLED: ${GOOGLE_ENABLED}5 GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}6 GOTRUE_EXTERNAL_GOOGLE_SECRET: ${GOOGLE_SECRET}7 GOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI: ${API_EXTERNAL_URL}/callback对于文件中未预配置的提供商(见下方的完整提供商列表),请按相同模式手动添加这些行:在 .env 中添加变量,通过 GOTRUE_EXTERNAL_PROVIDER_ 在 docker-compose.yml 中传递。
🌐 For providers not pre-configured in the files (see the full provider list below), add the lines manually following the same pattern: variables in .env, passthrough with GOTRUE_EXTERNAL_PROVIDER_ in docker-compose.yml.
第4步:重启认证服务 #
🌐 Step 4: Restart the auth service
1sh run.sh recreate auth步骤5:核实配置 #
🌐 Step 5: Verify the configuration
检查一下提供者是否已启用:
🌐 Check that the provider is enabled:
1curl -H 'apikey: your-anon-key' https://<your-domain>/auth/v1/settings回复中应在 external 下包括你的提供者:
🌐 The response should include your provider under external:
1{2 "external": {3 "google": true4 }5}供应商特定设置 #
🌐 Provider-specific setup
Google 云控制台设置:
- 前往 Google Cloud 控制台
- 创建或选择一个项目
- 在左侧导航菜单中选择 解决方案 > 所有产品
- 前往 APIs 与服务 > OAuth 同意屏幕,然后点击 开始使用
- 按照配置步骤操作并添加一个外部应用
- 去 API 和服务 > 凭据
- 点击 创建凭据 > OAuth 客户端 ID
- 将应用类型设置为 Web 应用
- 在 授权重定向 URI 下,添加:
https://<your-domain>/auth/v1/callback10。点击 创建 并复制客户端 ID 和客户端密钥
1GOOGLE_ENABLED=true2GOOGLE_CLIENT_ID=your-google-client-id.apps.googleusercontent.com3GOOGLE_SECRET=your-google-client-secret1auth:2 environment:3 # ... existing variables ...4 GOTRUE_EXTERNAL_GOOGLE_ENABLED: ${GOOGLE_ENABLED}5 GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}6 GOTRUE_EXTERNAL_GOOGLE_SECRET: ${GOOGLE_SECRET}7 GOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI: ${API_EXTERNAL_URL}/callback其他支持的提供商 #
🌐 Other supported providers
Supabase Auth 支持以下 OAuth 提供商:
🌐 Supabase Auth supports the following OAuth providers:
| 提供者 | 环境前缀 | 额外变量 | 文档 |
|---|---|---|---|
| 苹果 | APPLE_ | - | 使用苹果登录 |
| Azure(微软) | AZURE_ | URL(租户网址) | 用 Azure 登录 |
| Bitbucket | BITBUCKET_ | - | 使用 Bitbucket 登录 |
| Discord | DISCORD_ | - | 使用 Discord 登录 |
| 脸书 | FACEBOOK_ | - | 用脸书登录 |
| Figma | FIGMA_ | - | 使用 Figma 登录 |
| GitHub | GITHUB_ | URL(适用于 GitHub Enterprise) | 使用 GitHub 登录 |
| GitLab | GITLAB_ | URL(适用于自托管 GitLab) | 使用 GitLab 登录 |
| 谷歌 | GOOGLE_ | - | 使用谷歌登录 |
| Kakao | KAKAO_ | - | 使用 Kakao 登录 |
| Keycloak (OIDC) | KEYCLOAK_ | URL(字段 URL,必填) | 使用 Keycloak 登录 |
| LinkedIn (OIDC) | LINKEDIN_OIDC_ | - | 使用LinkedIn登录 |
| Notion | NOTION_ | - | 使用 Notion 登录 |
| Slack (OIDC) | SLACK_OIDC_ | - | 使用 Slack 登录 |
| Snapchat | SNAPCHAT_ | - | - |
| Spotify | SPOTIFY_ | - | 使用 Spotify 登录 |
| Twitch | TWITCH_ | - | 使用 Twitch 登录 |
| 推特 | TWITTER_ | - | 使用推特登录 |
| WorkOS | WORKOS_ | - | 使用 WorkOS 登录 |
| Zoom | ZOOM_ | - | 使用 Zoom 登录 |
对于每个提供者,你至少需要在 .env 和 docker-compose.yml 中有 ENABLED、CLIENT_ID、SECRET 和 REDIRECT_URI。
🌐 For each provider, you need at minimum ENABLED, CLIENT_ID, SECRET, and REDIRECT_URI in .env and docker-compose.yml.
LinkedIn (OIDC) 和 Slack (OIDC) 使用多词环境前缀。完整的 Docker Compose 变量分别是 GOTRUE_EXTERNAL_LINKEDIN_OIDC_CLIENT_ID 和 GOTRUE_EXTERNAL_SLACK_OIDC_CLIENT_ID —— 不是 LINKEDIN_CLIENT_ID 或 SLACK_CLIENT_ID。
测试登录流程 #
🌐 Test the login flow
你可以用下面这个最简 HTML 页面来测试 OAuth:
🌐 You can test OAuth with the following minimal HTML page:
- 把下面的代码保存到
index.html - 在同一目录下启动
python -m http.server 3000 - 确保在你自托管的 Supabase
.env配置中将SITE_URL设置为http://localhost:3000 - 打开你的浏览器,然后访问
http://localhost:3000
1<!doctype html>2<html>3 <body>4 <h1>Supabase OAuth Test</h1>5 <button id="loginBtn">Sign in with Google</button>6 <pre id="result"></pre>78 <script src="https://cdn.jsdelivr.net/npm/@supabase/supabase-js@2"></script>9 <script>10 document.addEventListener('DOMContentLoaded', function () {11 const SUPABASE_URL = 'https://<your-domain>'12 const SUPABASE_ANON_KEY = 'your-anon-key'1314 const supabase = window.supabase.createClient(SUPABASE_URL, SUPABASE_ANON_KEY)1516 const button = document.getElementById('loginBtn')1718 button.addEventListener('click', async () => {19 const { error } = await supabase.auth.signInWithOAuth({20 provider: 'google',21 })2223 if (error) {24 document.getElementById('result').textContent = JSON.stringify(error, null, 2)25 }26 })2728 supabase.auth.getSession().then(({ data }) => {29 if (data.session) {30 document.getElementById('result').textContent =31 'Logged in as: ' + data.session.user.email32 }33 })34 })35 </script>36 </body>37</html>有关详细的客户端集成,请参见 社交登录。
🌐 For detailed client-side integration, see Social Login.
故障排除 #
🌐 Troubleshooting
“提供者未启用”或在设置中看到提供者为假 #
🌐 "Provider not enabled" or provider seen as false in settings
- 检查一下
docker-compose.yml中的GOTRUE_EXTERNAL_*_ENABLED是否设置为true - 确认
.env变量不为空,比如用sh run.sh printenv auth | grep GOOGLE检查
变量已经添加到环境中了,但提供程序还是不工作 #
🌐 Variables added to the environment but provider still not working
.env 的配置变量不会自动在容器内可用,除非 docker-compose.yml 中有匹配的透传定义。可以检查,例如:
🌐 Configuration variables from .env are not automatically available inside the container unless there's a matching passthrough definition in docker-compose.yml. Check, e.g., for:
1auth:2 environment:3 # ... existing variables ...4 GOTRUE_EXTERNAL_GOOGLE_ENABLED: ${GOOGLE_ENABLED}运行 sh run.sh printenv auth | grep GOTRUE_EXTERNAL 来验证变量是否到达容器。
🌐 Run sh run.sh printenv auth | grep GOTRUE_EXTERNAL to verify the variables are reaching the container.
登录后网站网址或重定向网址错误 #
🌐 Site URL or redirect URL errors after login
在成功的 OAuth 登录后,认证服务会重定向到 SITE_URL 或来自 ADDITIONAL_REDIRECT_URLS 的 URL。请确保:
🌐 After a successful OAuth login, the Auth service redirects to SITE_URL or a URL from ADDITIONAL_REDIRECT_URLS. Ensure:
.env中的SITE_URL设置为你的 应用的网址- 如果你的应用使用了不同的重定向 URL,把它添加到
ADDITIONAL_REDIRECT_URLS(用逗号分隔)
手机上随机数检查失败(使用谷歌登录) #
🌐 Nonce check failure on mobile (Google Sign In)
在移动设备上使用带有 ID 令牌的 Google 登录时,nonce 验证可能会失败,因为移动 SDK 并不总是支持身份验证服务所期望的 nonce 流程。
🌐 When using Google Sign In on mobile with ID tokens, nonce verification may fail because mobile SDKs don't always support the nonce flow that the Auth service expects.
GOTRUE_EXTERNAL_SKIP_NONCE_CHECK 会禁用 ID 令牌的 nonce 验证,这会削弱重放攻击防护。把它当作短期排错临时方法,而不是永久解决方案:
- 只在你调试问题的环境中启用它。
- 问题解决后尽快恢复它。
- 最好修复客户端的 nonce 处理,或者切换到一种完全避免 ID token nonce 问题的 OAuth 流程(带 PKCE 的授权码)。
要启用它,请取消注释 docker-compose.yml 中的以下行:
🌐 To enable it, uncomment the following line in docker-compose.yml:
1auth:2 environment:3 # ... existing variables ...4 GOTRUE_EXTERNAL_SKIP_NONCE_CHECK: 'true'认证服务无法启动 #
🌐 Auth service fails to start
查看认证容器日志:
🌐 Check the auth container logs:
1docker compose logs auth常见原因:
🌐 Common causes:
- 缺少必要的环境变量(例如,
CLIENT_ID或SECRET为空) - 无效的
API_EXTERNAL_URL(必须是有效的 URL——包括协议并以/auth/v1结尾)
环境变量引用 #
🌐 Environment variable reference
docker-compose.yml 中 auth 服务的所有 OAuth 相关环境变量:
🌐 All OAuth-related environment variables for the auth service in docker-compose.yml:
| 变量 | 描述 | 是否必填 |
|---|---|---|
GOTRUE_EXTERNAL_*_ENABLED | 启用提供者 (true/false) | 是 |
GOTRUE_EXTERNAL_*_CLIENT_ID | 来自提供者的 OAuth 客户端 ID | 是 |
GOTRUE_EXTERNAL_*_SECRET | 来自提供者的 OAuth 客户端密钥 | 是 |
GOTRUE_EXTERNAL_*_REDIRECT_URI | 回调 URL:${API_EXTERNAL_URL}/callback | 是 |
GOTRUE_SITE_URL | 认证后的默认重定向 URL(通过 SITE_URL 在 .env 中设置) | 是 |
额外资源 #
🌐 Additional resources
- 重定向网址
- GitHub上的认证服务器(查看README和
example.env)