← 返回文章列表
开发笔记

在 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_insupabase_flutter 完成登录与登出

前置条件

  • 已能运行 Flutter 工程,并已按项目情况集成 supabase_flutterSupabase.initialize(若尚未完成,可先参考本站《在 Flutter 中接入 Supabase 邮箱登录》中的初始化步骤)。
  • 拥有 Google Cloud ConsoleSupabase 项目权限。
  • Android:能获取调试/发布用的 SHA-1keytool -list -v -keystore ...)。
  • iOS:macOS + Xcode,Bundle ID 固定;真机调试需正确签名。

第一步:Google Cloud — OAuth 同意屏幕

  1. 打开 Google Cloud Console,选择或创建与产品对应的项目。
  2. 进入 APIs & ServicesOAuth consent screen
  3. 选择用户类型(Internal 仅限 Workspace;对公众用户一般选 External),按向导填写应用名称、用户支持邮箱等。
  4. Scopes:至少包含 emailprofileopenidgoogle_sign_in 会按默认范围请求基础资料)。
  5. 测试阶段可将测试用户加入列表,直到应用通过审核(生产需按 Google 要求完成验证)。

第二步:Google Cloud — 创建 OAuth 客户端

需要在同一项目下创建 多种 客户端,分别给 Supabase、Android、iOS 使用。

2.1 Web 应用程序(给 Supabase 控制台用)

  1. APIs & ServicesCredentialsCreate CredentialsOAuth client ID
  2. 类型选 Web application
  3. 记下 Client IDClient secret
  4. 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

  1. 再创建一个 OAuth client ID,类型选 Android
  2. 填写 Package name(与 android/app/build.gradleapplicationId 一致)。
  3. 填写 SHA-1(debug 与 release 可各建一个客户端,或按你发布策略配置)。

2.3 iOS

  1. 创建 OAuth client ID,类型选 iOS
  2. Bundle ID 与 Xcode 里 RunnerBundle Identifier 完全一致。

第三步:Supabase — 启用 Google

  1. Supabase 控制台 → AuthenticationProvidersGoogle
  2. 开启 Enable Sign in with Google
  3. Client IDClient Secret 填入第二步 Web 应用程序 的那一对。
  4. 保存。同时检查 AuthenticationURL ConfigurationSite URLRedirect 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

  1. 在 Xcode 打开 ios/Runner.xcworkspace,确认 Bundle Identifier 与 Google iOS 客户端一致。
  2. google_sign_in 文档 配置 URL Types:将 Google 提供的 REVERSED_CLIENT_ID(或控制台展示的 iOS URL Scheme)加入 InfoURL 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)传给 GoogleSignInserverClientId(与插件文档中的命名一致)。

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 为 nullAndroid 是否配置 serverClientId(Web Client ID);SHA-1 是否与 Cloud 中 Android 客户端一致
iOS 白屏或无法返回 AppURL Scheme / REVERSED_CLIENT_ID 是否在 Xcode 中配置
Supabase 报 Google 相关错误控制台 Google 提供商是否启用;Web 的 Client ID/Secret 是否填对;Redirect是否与 Google Cloud 一致
仅测试账号能登录OAuth 同意屏幕仍为 Testing,需添加测试用户或发布应用

小结

  1. Google Cloud:同意屏幕 + Web / Android / iOS 三类 OAuth 客户端;Web 的 ID/Secret 给 Supabase,Web Client ID 常作为 Flutter里 serverClientId
  2. Supabase:启用 Google,填入 Web 凭据,并核对 Redirect URLs
  3. Flutter:google_sign_inidTokensignInWithIdToken(OAuthProvider.google, ...) 交给 Supabase。
  4. 登出时 GoogleSignIn.signOut()supabase.auth.signOut() 一并调用更稳妥。

按上述步骤即可在 Flutter 中完成 Google 登录 + Supabase Auth;若还需 Apple 登录 或与 深度链接 结合的 OAuth,可在同一 Auth 会话模型上扩展。