当 Docker 认证破坏移动端登录:跨平台 Bug 追踪记
症状
Google Sign In 和 Apple Sign In 在 iOS 和 Android 上都无法工作。错误不一致——有时是超时,有时是 OAuth 回调错误,有时是用户只是看到一个空白屏幕并被返回到登录界面。在 Web 浏览器中,相同的 OAuth 流程完美运作。
调试路径
第一个怀疑点是 OAuth 回调 URL 配置——移动端和 Web 端使用不同的 redirect URI 格式。验证两者在 Google Cloud Console 和 Apple Developer 门户中都已正确注册。它们是正确的。
第二个怀疑点是 Supabase 客户端配置——React Native 需要不同于 Web 的 Supabase 客户端设置。配置看起来是正确的。
突破点出现在查看原始网络请求时:OAuth 回调到达服务器,但 Supabase 认证容器返回了 502 错误,而不是处理回调。
根本原因
Supabase 的认证容器(GoTrue)配置了严格的 URL 验证,会拒绝包含 :/ 方案分隔符的回调 URL(用于 iOS 的 myapp:// 深度链接)。这个验证在容器默认配置中不允许深度链接方案,只允许 HTTPS URL。
Web 端使用 https:// 回调,所以它工作正常。移动端使用 myapp:// 深度链接,所以它失败了。
修复
修复是在 GoTrue 配置中明确允许 URI 方案:
GOTRUE_URI_ALLOW_LIST=myapp://,https://app.domain.com这个配置项在 Supabase 自托管文档中存在,但埋得比较深——它不在主要的 GoTrue 配置参考中,而是在移动端认证的特定指南部分。
为什么很难在本地重现
本地开发设置通常使用 HTTP 和 localhost,这绕过了在生产 HTTPS 端点上触发的验证。这类 bug——只在生产 HTTPS 配置下表现出来——需要暂存环境来可靠地重现。