Windows端Firebase谷歌登录报invalid-credential错误求助
问题描述
使用google_sign_in_all_platforms包实现Firebase谷歌登录时,谷歌登录流程成功完成,但调用firebaseAuth.signInWithCredential时抛出错误:
[firebase_auth/invalid-credential] The supplied auth credential is malformed or has expired.
已按照官方指南完成Firebase项目设置及Google Cloud Console配置,相关代码如下:
final googleSignInProvider = Provider<GoogleSignIn>((ref) { return GoogleSignIn( params: GoogleSignInParams( timeout: Duration(hours: 24), clientId: clientId, clientSecret: clientSecret, redirectPort: redirectPort, scopes: ['email', 'profile'], ), ); }); final firebaseAuthProvider = Provider<FirebaseAuth>((ref) { return FirebaseAuth.instance; }); Future<void> firebaseSignIn(BuildContext context, WidgetRef ref) async { final firebaseAuth = ref.watch(firebaseAuthProvider); final googleSignIn = ref.watch(googleSignInProvider); try { //await googleSignIn.signOut(); final credentials = await googleSignIn.signIn(); if (credentials != null) { debugPrint('Signed in successfully.'); //Google sign in is successful } else { debugPrint('Sign in failed.'); return; } final authCredential = GoogleAuthProvider.credential( idToken: credentials.idToken, accessToken: credentials.accessToken, ); //The below line is failing. Printing the token is however successful final userCredential = await firebaseAuth.signInWithCredential(authCredential); final user = userCredential.user; debugPrint(user?.email); } catch (e) { debugPrint("<<<<< Failed to sign in with Firebase $e"); } }
排查步骤
- 验证ID Token有效性:
将获取到的credentials.idToken通过Google官方的Token验证工具验证,确认其是否有效、是否关联正确的项目ID、是否过期。若Token无效,说明google_sign_in_all_platforms返回的凭证本身存在问题。 - 核对Client ID一致性:
确认Firebase项目中配置的对应平台Client ID(如Web端用Web Client ID),与GoogleSignInParams中的clientId完全一致,包括大小写和特殊字符,避免混用不同平台的Client ID。 - 移除Web平台的Client Secret:
若为Web平台,GoogleSignInParams无需传入clientSecret(该参数用于服务器端验证场景),尝试移除该参数后重新测试。 - 清除旧会话状态:
取消代码中await googleSignIn.signOut();的注释,确保每次登录前清除旧的登录会话,避免旧凭证残留导致冲突。 - 检查Firebase Auth配置:
确认Firebase控制台中「Authentication」模块已启用,且「Google」登录方式已开启,关联的Client ID配置正确。 - 补充OpenID权限:
将scopes修改为['email', 'profile', 'openid'],因为Firebase需要OpenID协议生成的ID Token来完成身份验证,部分场景下默认scopes不包含该权限。
内容的提问来源于stack exchange,提问作者Theo
相关产品推荐
相关产品推荐

