使用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
相关产品推荐
相关产品推荐

