📋 问题描述
症状: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
- 打开 Google Play Console
- 选择应用 → Test and release → App integrity
- 点击 Play app signing 的 Settings
- 找到 App signing key certificate 的 SHA-1
2. 更新 Google Cloud Console
- 打开 Google Cloud Console - Credentials
- 编辑 Android Release OAuth Client
- 将 SHA-1 改为 App signing key 的 SHA-1
- 保存
3. 清除 Google Play 服务缓存(测试设备)
由于之前用错误的 SHA-1 尝试过登录,手机缓存了旧配置:
- 手机 设置 → 应用 → Google Play 服务
- 存储 → 清除缓存
- 重新测试
⚠️ 注意:普通用户不需要这一步,只有测试设备因缓存旧数据才需要清除。
📌 经验总结
- AAB 上传 = Google 重新签名:必须使用 App signing key 的 SHA-1
- APK 直接安装:使用 Upload key 的 SHA-1
- Release 模式调试 :使用
dart:developer的log()函数 - 缓存问题:测试时如遇问题,清除 Google Play 服务缓存
🔧 调试检查清单
-
\] 确认 OAuth 同意屏幕已配置并发布(或测试账号已添加)
-
\] 确认使用正确的 SHA-1(Google Play 下载用 App signing key)
-
\] 测试设备清除 Google Play 服务缓存