Flutter Firebase:同邮箱账号的邮箱/密码与Google登录冲突验证实现
解决Firebase同一邮箱跨登录方式覆盖账号的问题
核心思路
在执行Google登录的完整流程前,先通过邮箱查询已关联的登录方式,若存在邮箱/密码认证记录,则终止Google登录流程并提示用户。
具体实现步骤
获取Google登录凭证与用户邮箱
先完成Google登录的前置授权流程,拿到认证凭证的同时提取用户邮箱:final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn(); if (googleUser == null) { // 用户取消登录,直接返回 return; } final GoogleSignInAuthentication googleAuth = await googleUser.authentication; final AuthCredential credential = GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); final String userEmail = googleUser.email;查询邮箱绑定的登录方式
调用Firebase Auth的fetchSignInMethodsForEmail方法,获取该邮箱已关联的所有登录方式:final List<String> signInMethods = await FirebaseAuth.instance.fetchSignInMethodsForEmail(userEmail);验证并拦截冲突登录
检查返回的登录方式列表中是否包含密码登录(对应标识为password),如果存在则终止流程并提示用户;否则继续完成Google登录:if (signInMethods.contains('password')) { // 邮箱已绑定密码账号,弹出提示阻止登录 ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('该邮箱已通过密码注册,请使用密码登录')), ); return; } // 无密码账号记录,继续完成Google登录 final UserCredential userCredential = await FirebaseAuth.instance.signInWithCredential(credential); // 此处处理登录成功后的业务逻辑
补充说明
fetchSignInMethodsForEmail会返回该邮箱所有已关联的登录方式,比如仅密码登录返回['password'],仅Google登录返回['google.com'],若账号已绑定多种方式则会包含多个标识。- 若用户需要将密码账号与Google账号关联,应引导用户先通过密码登录,再调用
linkWithCredential方法绑定Google凭证,而非直接用Google登录覆盖原账号。
内容的提问来源于stack exchange,提问作者SYED RAKIBUL HASAN
相关产品推荐
相关产品推荐

