You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Flutter对接Firebase Auth模拟器时Google登录报错

解决Firebase Auth模拟器Google登录的id_token限制问题

问题原因

Firebase Auth模拟器对Google登录有特殊限制:仅支持使用id_token进行身份验证,不接受access_token,这和生产环境的Firebase实例行为不同。

修复方案

方案1:通用兼容写法

直接移除accessToken参数,只传入id_token。这种方式同时兼容模拟器和生产环境——Firebase Auth在生产环境中也支持仅通过id_token完成Google登录验证。

修改后的代码:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';

Future<UserCredential> signInWithGoogle() async {
  // 触发Google登录流程
  final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn();

  // 获取登录验证信息
  final GoogleSignInAuthentication? googleAuth = await googleUser?.authentication;

  // 创建凭证 - 仅传入idToken
  final credential = GoogleAuthProvider.credential(
    idToken: googleAuth?.idToken,
  );

  // 完成登录并返回用户凭证
  return await FirebaseAuth.instance.signInWithCredential(credential);
}

方案2:按环境动态处理

如果需要保留生产环境对accessToken的使用,可以通过判断是否连接模拟器,动态决定是否传入accessToken:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';

Future<UserCredential> signInWithGoogle() async {
  // 触发Google登录流程
  final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn();

  // 获取登录验证信息
  final GoogleSignInAuthentication? googleAuth = await googleUser?.authentication;

  // 判断是否使用Auth模拟器
  final isUsingAuthEmulator = FirebaseAuth.instance.useEmulator;

  // 创建凭证
  final credential = GoogleAuthProvider.credential(
    accessToken: isUsingAuthEmulator ? null : googleAuth?.accessToken,
    idToken: googleAuth?.idToken,
  );

  // 完成登录并返回用户凭证
  return await FirebaseAuth.instance.signInWithCredential(credential);
}

验证说明

修改后重新运行连接模拟器的项目,Google登录即可正常完成身份验证;生产环境下无论是否传入accessToken,Firebase Auth都能正确处理Google登录请求。

内容的提问来源于stack exchange,提问作者starleaf1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 06:03:36