Google 登录问题排查指南

📋 问题描述

症状:Flutter 应用通过 Google Play 下载安装后,点击 Google 登录按钮报错:

css 复制代码
GoogleSignInException(code GoogleSignInExceptionCode.canceled, [16] Account reauth failed., null)

环境

  • Flutter + google_sign_in 插件
  • 应用以 AAB 格式上传到 Google Play
  • 用户从 Google Play 下载安装

🔍 排查过程

第 1 步:添加调试日志

由于 Release 模式下 print() 不输出日志,创建了一个日志收集器在应用内显示错误详情:

dart 复制代码
import 'dart:developer' as developer;

class GoogleAuthLogger {
  static final List<String> _logs = [];
  
  static void log(String message) {
    final timestamp = DateTime.now().toString().substring(11, 19);
    final entry = '[$timestamp] $message';
    _logs.add(entry);
    developer.log(message, name: 'GoogleAuth');
  }
  
  static String getLogs() => _logs.join('\n');
  static void clear() => _logs.clear();
}

在 UI 中添加"查看调试日志"按钮,登录失败时显示详细日志。

第 2 步:定位问题

通过日志发现错误发生在 Google 原生认证阶段(还没到 Supabase):

csharp 复制代码
[22:46:47] 📱 触发 Google 登录界面
[22:46:49] ❌ Google 认证失败: GoogleSignInException(code GoogleSignInExceptionCode.canceled, [16] Account reauth failed., null)

错误码 [16] Account reauth failed 表示 SHA-1 指纹不匹配

第 3 步:检查 SHA-1 配置

检查本地 Release keystore 的 SHA-1:

vbnet 复制代码
keytool -list -v -keystore ~/linguadiary-release-key.jks -alias linguadiary-key-alias

输出:

ruby 复制代码
SHA1: 13:0X:62:E7:BE:32:F4:E4:C1:0C:D6:04:BA:15:F7:BD:7D:49:13:C9

Google Cloud Console 中的 Android OAuth Client 已配置这个 SHA-1,但还是失败...

第 4 步:发现根本原因

应用是以 AAB 格式 上传到 Google Play 的,Google Play 会用自己的密钥重新签名 APK

这意味着用户下载的 APK 签名与本地 keystore 不同。

🔑 关键知识:两个证书的区别

证书

SHA-1

谁持有

用途

Upload Key (上传密钥)

13:0F:61:E7:...

开发者本地

上传 AAB 到 Google Play 时验证身份

App Signing Key (应用签名密钥)

DC:B4:A6:04:...

Google 服务器

给用户下载的 APK 签名

流程图

vbnet 复制代码
开发者电脑                  Google Play                 用户手机
    │                           │                           │
    │  1. 用 Upload key 签名    │                           │
    │     AAB 上传              │                           │
    ├──────────────────────────►│                           │
    │                           │  2. Google 用             │
    │                           │     App signing key       │
    │                           │     重新签名 APK          │
    │                           ├──────────────────────────►│
    │                           │                           │
    │                           │     用户安装的 APK        │
    │                           │     签名 = App signing key│

✅ 解决方案

1. 获取 App Signing Key 的 SHA-1

  1. 打开 Google Play Console
  2. 选择应用 → Test and releaseApp integrity
  3. 点击 Play app signingSettings
  4. 找到 App signing key certificate 的 SHA-1

2. 更新 Google Cloud Console

  1. 打开 Google Cloud Console - Credentials
  2. 编辑 Android Release OAuth Client
  3. 将 SHA-1 改为 App signing key 的 SHA-1
  4. 保存

3. 清除 Google Play 服务缓存(测试设备)

由于之前用错误的 SHA-1 尝试过登录,手机缓存了旧配置:

  1. 手机 设置应用Google Play 服务
  2. 存储清除缓存
  3. 重新测试

⚠️ 注意:普通用户不需要这一步,只有测试设备因缓存旧数据才需要清除。

📌 经验总结

  1. AAB 上传 = Google 重新签名:必须使用 App signing key 的 SHA-1
  2. APK 直接安装:使用 Upload key 的 SHA-1
  3. Release 模式调试 :使用 dart:developerlog() 函数
  4. 缓存问题:测试时如遇问题,清除 Google Play 服务缓存

🔧 调试检查清单

  • \] 确认 OAuth 同意屏幕已配置并发布(或测试账号已添加)

  • \] 确认使用正确的 SHA-1(Google Play 下载用 App signing key)

  • \] 测试设备清除 Google Play 服务缓存

相关推荐
行者9613 小时前
Flutter与OpenHarmony深度集成:数据导出组件的实战优化与性能提升
flutter·harmonyos·鸿蒙
小雨下雨的雨13 小时前
Flutter 框架跨平台鸿蒙开发 —— Row & Column 布局之轴线控制艺术
flutter·华为·交互·harmonyos·鸿蒙系统
小雨下雨的雨13 小时前
Flutter 框架跨平台鸿蒙开发 —— Center 控件之完美居中之道
flutter·ui·华为·harmonyos·鸿蒙
小雨下雨的雨14 小时前
Flutter 框架跨平台鸿蒙开发 —— Icon 控件之图标交互美学
flutter·华为·交互·harmonyos·鸿蒙系统
小雨下雨的雨14 小时前
Flutter 框架跨平台鸿蒙开发 —— Placeholder 控件之布局雏形美学
flutter·ui·华为·harmonyos·鸿蒙系统
行者9615 小时前
OpenHarmony Flutter弹出菜单组件深度实践:从基础到高级的完整指南
flutter·harmonyos·鸿蒙
前端不太难15 小时前
Flutter / RN / iOS,在长期维护下的性能差异本质
flutter·ios
小雨下雨的雨16 小时前
Flutter 框架跨平台鸿蒙开发 —— Padding 控件之空间呼吸艺术
flutter·ui·华为·harmonyos·鸿蒙系统
行者9616 小时前
Flutter到OpenHarmony:横竖屏自适应布局深度实践
flutter·harmonyos·鸿蒙
小雨下雨的雨16 小时前
Flutter 框架跨平台鸿蒙开发 —— Align 控件之精准定位美学
flutter·ui·华为·harmonyos·鸿蒙