在 Flutter 中用 Google 登录接入 Supabase Auth(分步指南)
本文说明如何在 Flutter 应用里使用 Google 登录,并通过 Supabase Auth 建立会话。推荐做法是:用 google_sign_in 在本地完成 Google 授权,拿到 ID Token(及 Access Token),再调用 Supabase 的 signInWithIdToken,由 Supabase 校验令牌并签发自己的用户会话。
官方参考:Supabase · Google 登录(含 Flutter)、google_sign_in。
你将完成什么
- 在 Google Cloud 配置 OAuth 同意屏幕与各类客户端凭据
- 在 Supabase 启用 Google 提供商并填入 Web 客户端的 ID 与密钥
- 在 Flutter 中串联
google_sign_in与supabase_flutter完成登录与登出
前置条件
- 已能运行 Flutter 工程,并已按项目情况集成
supabase_flutter与Supabase.initialize(若尚未完成,可先参考本站《在 Flutter 中接入 Supabase 邮箱登录》中的初始化步骤)。 - 拥有 Google Cloud Console 与 Supabase 项目权限。
- Android:能获取调试/发布用的 SHA-1(
keytool -list -v -keystore ...)。 - iOS:macOS + Xcode,Bundle ID 固定;真机调试需正确签名。
第一步:Google Cloud — OAuth 同意屏幕
- 打开 Google Cloud Console,选择或创建与产品对应的项目。
- 进入 APIs & Services → OAuth consent screen。
- 选择用户类型(Internal 仅限 Workspace;对公众用户一般选 External),按向导填写应用名称、用户支持邮箱等。
- Scopes:至少包含
email、profile、openid(google_sign_in会按默认范围请求基础资料)。 - 测试阶段可将测试用户加入列表,直到应用通过审核(生产需按 Google 要求完成验证)。
第二步:Google Cloud — 创建 OAuth 客户端
需要在同一项目下创建 多种 客户端,分别给 Supabase、Android、iOS 使用。
2.1 Web 应用程序(给 Supabase 控制台用)
- APIs & Services → Credentials → Create Credentials → OAuth client ID。
- 类型选 Web application。
- 记下 Client ID 与 Client secret。
- 在 Authorized JavaScript origins / Authorized redirect URIs 中,按 Supabase 文档 添加 Supabase 提供的回调地址(形如
https://<project-ref>.supabase.co/auth/v1/callback)。
Supabase 控制台的 Google 提供商里填的通常是 这一对 Web 客户端的 ID 和 Secret,用于服务端与 Google 交换/校验;移动端仍使用下面的 Android/iOS 客户端与
google_sign_in。
2.2 Android
- 再创建一个 OAuth client ID,类型选 Android。
- 填写 Package name(与
android/app/build.gradle里applicationId一致)。 - 填写 SHA-1(debug 与 release 可各建一个客户端,或按你发布策略配置)。
2.3 iOS
- 创建 OAuth client ID,类型选 iOS。
- Bundle ID 与 Xcode 里
Runner的 Bundle Identifier 完全一致。
第三步:Supabase — 启用 Google
- Supabase 控制台 → Authentication → Providers → Google。
- 开启 Enable Sign in with Google。
- Client ID、Client Secret 填入第二步 Web 应用程序 的那一对。
- 保存。同时检查 Authentication → URL Configuration:Site URL、Redirect URLs 与你在 Google Cloud 为 Web 客户端填写的重定向一致,避免 OAuth 回调被拒绝。
第四步:Flutter 依赖
在 pubspec.yaml 中(版本以 pub.dev 为准):
dependencies:
flutter:
sdk: flutter
supabase_flutter: ^2.8.0
google_sign_in: ^6.2.0
flutter pub get
第五步:Android 与 iOS 原生注意点
Android
minSdkVersion满足google_sign_in与 Play 服务要求(一般 ≥ 21,以插件说明为准)。- 确保本机构建的 SHA-1 已加入 Google Cloud 里 Android OAuth 客户端,否则会出现
sign_in_failed、拿不到idToken等错误。
iOS
- 在 Xcode 打开
ios/Runner.xcworkspace,确认 Bundle Identifier 与 Google iOS 客户端一致。 - 按 google_sign_in 文档 配置 URL Types:将 Google 提供的 REVERSED_CLIENT_ID(或控制台展示的 iOS URL Scheme)加入 Info → URL Types,否则登录完成后无法跳回 App。
若你同时使用 Firebase 下载的 GoogleService-Info.plist,其中 REVERSED_CLIENT_ID 可作为 URL Scheme 来源之一;以当前 Google Cloud 中 iOS OAuth 客户端 说明为准。
第六步:登录代码(ID Token → Supabase)
在 Android 上,若要让 GoogleSignInAuthentication.idToken 稳定返回,通常需要把 Web 客户端的 Client ID(不是 Android 客户端 ID)传给 GoogleSignIn 的 serverClientId(与插件文档中的命名一致)。
import 'package:google_sign_in/google_sign_in.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
/// 使用 Google Cloud 里「Web 应用」OAuth 客户端的 Client ID(通常以 .apps.googleusercontent.com 结尾)
const String kGoogleWebClientId =
'YOUR_WEB_CLIENT_ID.apps.googleusercontent.com';
final GoogleSignIn _googleSignIn = GoogleSignIn(
serverClientId: kGoogleWebClientId,
scopes: const ['email', 'profile'],
);
Future<void> signInWithGoogle() async {
final googleUser = await _googleSignIn.signIn();
if (googleUser == null) {
// 用户取消
return;
}
final googleAuth = await googleUser.authentication;
final idToken = googleAuth.idToken;
final accessToken = googleAuth.accessToken;
if (idToken == null) {
throw Exception('未能获取 Google ID Token,请检查 serverClientId 与 SHA-1/Bundle 配置');
}
await Supabase.instance.client.auth.signInWithIdToken(
provider: OAuthProvider.google,
idToken: idToken,
accessToken: accessToken,
);
}
登录成功后,Supabase.instance.client.auth.currentSession 非空,可与现有邮箱登录共用同一套会话与 RLS 策略。
第七步:登出
建议同时清理 Google 与 Supabase 会话,避免切换账号时仍沿用旧 Google 账户。
Future<void> signOut() async {
await _googleSignIn.signOut();
await Supabase.instance.client.auth.signOut();
}
第八步:联调与排错
| 现象 | 建议排查 |
|---|---|
idToken 为 null | Android 是否配置 serverClientId(Web Client ID);SHA-1 是否与 Cloud 中 Android 客户端一致 |
| iOS 白屏或无法返回 App | URL Scheme / REVERSED_CLIENT_ID 是否在 Xcode 中配置 |
| Supabase 报 Google 相关错误 | 控制台 Google 提供商是否启用;Web 的 Client ID/Secret 是否填对;Redirect是否与 Google Cloud 一致 |
| 仅测试账号能登录 | OAuth 同意屏幕仍为 Testing,需添加测试用户或发布应用 |
小结
- Google Cloud:同意屏幕 + Web / Android / iOS 三类 OAuth 客户端;Web 的 ID/Secret 给 Supabase,Web Client ID 常作为 Flutter里
serverClientId。 - Supabase:启用 Google,填入 Web 凭据,并核对 Redirect URLs。
- Flutter:
google_sign_in取idToken,signInWithIdToken(OAuthProvider.google, ...)交给 Supabase。 - 登出时
GoogleSignIn.signOut()与supabase.auth.signOut()一并调用更稳妥。
按上述步骤即可在 Flutter 中完成 Google 登录 + Supabase Auth;若还需 Apple 登录 或与 深度链接 结合的 OAuth,可在同一 Auth 会话模型上扩展。