在确认注册之前验证用户的电子邮件地址,使用 Flutter 和 Firebase

Posted

技术标签:

【中文标题】在确认注册之前验证用户的电子邮件地址,使用 Flutter 和 Firebase【英文标题】:Verify a user's email address before confirming registration, with Flutter and Firebase 【发布时间】:2020-06-02 11:29:15 【问题描述】:

我创建了一个与我的 Flutter 应用程序配合使用的登录和注册屏幕,使用 Firebase 作为后端身份验证服务。我可以很好地在登录、注册和重置密码屏幕之间切换。

问题

目前,注册屏幕接受输入的任何电子邮件地址,无论它是否真实。例如,如果我输入 gvevg@gverwbgw.com,它将允许用户注册。当涉及到虚假帐户和垃圾邮件等时,这显然是一个问题。

目标

我基本上希望能够编辑我的代码,以自动生成电子邮件地址验证电子邮件,从而防止用户在他们的电子邮件地址得到验证之前登录。我编写的代码使用FutureFirebaseAuthasync/await 来实现这一点。

我当前的代码

首先,我定义了一个 AuthBase 抽象类,它创建了“createUserWithEmailAndPassword”函数(以及其他),如下所示:

abstract class AuthBase 
  Stream<User> get onAuthStateChanged;
  Future<User> currentUser();
  Future<User> createUserWithEmailAndPassword(String email, String password);

然后,我创建一个Auth函数,实现AuthBase,从Firebase获取当前用户,并创建注册Future函数,如下:

class Auth implements AuthBase 
  final _firebaseAuth = FirebaseAuth.instance;

  // This creates the user ID token variable (if one doesn't already exist) which is then populated using one of the login methods.
  User _userFromFirebase(FirebaseUser user) 
    if (user == null) 
      return null;
    
    return User(uid: user.uid);
  

  // This helps to get the user from Google Firebase, noting if there is or isn't a user with those login details already.
  @override
  Stream<User> get onAuthStateChanged 
    return _firebaseAuth.onAuthStateChanged.map(_userFromFirebase);
  

  // This identifies the current user, who is logged in at the time.
  @override
  Future<User> currentUser() async 
    final user = await _firebaseAuth.currentUser();
    return _userFromFirebase(user);
  

  // This creates the user account for an email-and-password sign-in, with firebase, if it doesn't already exist.
  @override
  Future<User> createUserWithEmailAndPassword(
      String email, String password) async 
    final authResult = await _firebaseAuth.createUserWithEmailAndPassword(
        email: email, password: password);
    return _userFromFirebase(authResult.user);
  

我的问题

如何编辑我的代码,以便它允许我为任何想要使用电子邮件登录的用户自动实施电子邮件验证?我相信sendEmailVerification()函数必须使用FirebaseUser,虽然我不确定如何在这里实现它。我将不胜感激任何帮助。谢谢!

【问题讨论】:

邮箱+密码认证只需要用户知道邮箱+密码的组合即可。它本身并不需要验证电子邮件地址才能登录。如果您希望在允许访问其他数据之前验证电子邮件地址,您可以通过检查 user's token for the email_verified claim 来做到这一点,例如在安全规则中你的数据库。 另见***.com/q/36943350、***.com/a/48029049、***.com/a/56784168、***.com/a/57343047 【参考方案1】:

邮箱+密码认证只需要用户知道邮箱+密码的组合即可。它本身并不需要验证电子邮件地址才能登录。如果您希望在允许访问其他数据之前验证电子邮件地址,您可以通过checking the user's token for the email_verified claim 来执行此操作,例如在数据库的安全规则中.

另见:

How do I lock down Firebase Database to any user from a specific (email) domain? Firebase email verification at SignUp How to prevent user authentication in Firebase/Vue.js BEFORE email is verified Only let pre-verified users log into Firebase

【讨论】:

谢谢!那么,如果我可以使用auth.token.email_verified == true 添加验证,那么这将起作用,而无需从应用程序/firebase 设置自动电子邮件生成?大概是因为任何设置了他们正在使用的电子邮件的人最初都必须对其进行验证,因此虚假和垃圾邮件(未经验证)将被拒绝? 我不明白你的意思。如果用户通过 Firebase 身份验证的内置机制验证其电子邮件地址,则其 auth.token.email_verified 将设置为 true。您可以在您的代码以及实时数据库、Firestore 和存储的安全规则中检查这一点,以确保用户在验证其电子邮件地址之前无法访问这些服务中的任何内容。 我现在明白了。我很快就会试一试,看看我能不能让它工作。我在您提供信息之前看到的示例基本上阻止了注册,直到用户验证了他们的电子邮件地址 - 因此使用自动生成的电子邮件验证电子邮件。

以上是关于在确认注册之前验证用户的电子邮件地址,使用 Flutter 和 Firebase的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 确认电子邮件未发送

Django - 身份验证,使用电子邮件确认注册

如何在进入主页之前验证电子邮件

设计在更新时不确认电子邮件

由于 msnbot,发送给 Outlook 用户的电子邮件验证链接过期

如何在注册用户之前验证来自 EditText 的电子邮件和密码输入