Supabase|集成 Google 登录认证

iOS 应用的 Google 登录流程:

iOS App → Google OAuth (获取 ID Token) → Supabase Auth (验证 Token) → 返回 Session

在 Google Cloud Console 创建 OAuth 客户端(iOS 以及 Web)

iOS 客户端出于安全考虑不提供 Client Secret(移动端无法安全存储密钥),但 Supabase 作为服务器端需要 Client Secret 来与 Google OAuth 服务通信。

因此,我们需要创建两个 OAuth 2.0 Client IDs,一起添加到 Supabase 配置后台。

💡
这个步骤都可以让 Claude Code 操作,它清楚如何做。
客户端类型 用途 Client Secret
iOS iOS 设备上发起 Google 登录,获取 ID Token ❌ 无
Web Supabase 服务器端验证 Token ✅ 有

创建 iOS OAuth 客户端

  1. 访问 https://console.cloud.google.com/ > Google Auth Platform > Clients
  2. 点击 + Create client,选择 iOS
  3. 填写 Bundle ID(与 Xcode 项目一致)
  4. 创建后下载 plist 文件

创建 Web OAuth 客户端

  1. 点击 + Create client,选择 Web application
  2. 在 Authorized redirect URIs 中添加:
    https://your-project-ref.supabase.co/auth/v1/callback
  3. 创建后记录 Client ID 和 Client Secret

配置 Supabase Google 认证

配置 Client IDs

在 Supabase Dashboard 启用 Google 认证方式。

Client IDs 必须填写两个,使用逗号分隔。

必须启用 Skip nonce checks

Nonce 是一次性随机字符串,用于防止重放攻击:

  1. 客户端生成 nonce → 发送给 Google
  2. Google 将 nonce 包含在 ID Token 中
  3. 服务器验证 nonce 是否匹配

为什么 iOS 必须跳过?

iOS Google Sign-In SDK 的限制:

  • SDK 内部自动生成 nonce
  • 不会将原始 nonce 暴露给应用

let idToken = result.user.idToken?.tokenString // ✅ 可获取
let nonce = ??? // ❌ 无法获取 SDK 内部的 nonce

由于应用无法获取 nonce,就无法传递给 Supabase 验证,因此必须跳过。

安全说明:跳过 nonce 检查会略微降低安全性,但 ID Token 本身有效期较短(约 1 小时),可部分缓解风险。