Flutter移动端Google登录账号启用多因素认证前的邮箱验证方法咨询
问题描述
我给一个已通过Google登录的账号添加多因素认证(MFA)时,收到错误提示:
[SmsRetrieverHelper] SMS verification code request failed: unknown status code: 17086 Need to verify email first before enrolling second factors.
现在需要验证该Google账号绑定的邮箱,但不确定该用哪种方式:
- 是否需要用邮箱密码重新认证,执行以下代码后关联Google和邮箱认证提供商?
final credential = EmailAuthProvider.credential(email: emailAddress, password: password);
- 还是需要使用邮箱链接认证的方式?
- 有没有更简便的方法直接验证Google账号的邮箱?
我当前的Google登录代码如下:
final GoogleSignIn googleSignIn = GoogleSignIn(); Future<UserCredential> signInWithGoogle(BuildContext context) async { // Trigger the authentication flow final GoogleSignInAccount? googleUser = await (googleSignIn.signIn()); // Obtain the auth details from the request final GoogleSignInAuthentication? googleAuth = await googleUser?.authentication; // Create a new credential final credential = GoogleAuthProvider.credential( accessToken: googleAuth?.accessToken, idToken: googleAuth?.idToken, ); // Once signed in, return the UserCredential final UserCredential authResult = await FirebaseAuth.instance.signInWithCredential(credential); String? name = authResult.user?.displayName; final String? email = authResult.user?.providerData[0].email ; final String? imageUrl = authResult.user?.photoURL; //Only taking the first part of the name, i.e., First Name if (name!.contains(" ")) { name = name.substring(0, name.indexOf(" ")); } print(name); print(email); print(imageUrl); print(authResult.user?.emailVerified); return authResult; }
解决方案
不需要关联邮箱认证提供商,也不用邮箱链接认证,最简便的方法是直接给当前已登录的Google账号用户发送邮箱验证邮件:
- 确认邮箱未验证状态:从你的登录代码输出的
authResult.user?.emailVerified值,确认是否为false,这是触发错误的核心原因。 - 发送验证邮件:在Google登录成功后,调用Firebase Auth内置的邮箱验证方法:
final User? user = authResult.user; if (user != null && !user.emailVerified) { await user.sendEmailVerification(); // 这里可以给用户弹出提示,告知去绑定的邮箱查收验证链接 }
- 完成验证后开启MFA:用户点击邮件中的验证链接后,账号的
emailVerified状态会自动变为true,此时再尝试添加多因素认证就不会报错了。
额外说明
- 两种备选方案都不适用:
- 用邮箱密码认证再关联的方式,前提是用户原本拥有邮箱密码登录的账号,但此场景下用户仅通过Google登录,未设置过邮箱密码,无法使用该方法。
- 邮箱链接认证是用于登录的流程,不是验证现有账号邮箱的手段,属于冗余操作。
- 确保Firebase控制台中已配置好邮箱验证模板,否则用户可能收不到验证邮件;若用户未收到,可提供重新发送按钮,再次调用
sendEmailVerification()即可。
内容的提问来源于stack exchange,提问作者Bernhard
相关产品推荐
相关产品推荐

