未发送 Firebase 确认电子邮件

Firebase confirmation email not being sent

我已成功设置 Firebase email/password 身份验证,但出于安全原因,我希望用户确认 her/his 电子邮件。 它在 Firebases 网站上说:

When a user signs up using an email address and password, a confirmation email is sent to verify their email address.

但是当我注册时,我没有收到确认邮件。

我看了,只找到发送密码重置邮件的代码,没有找到发送确认邮件的代码。

我看过这里:

https://firebase.google.com/docs/auth/ios/manage-users#send_a_password_reset_email

有人知道我该怎么做吗?

我注意到新的 Firebase 电子邮件身份验证文档没有正确记录。

firebase.auth().onAuthStateChanged(function(user) {
  user.sendEmailVerification(); 
});

请注意:

  1. 您只能向使用电子邮件和密码方法创建的用户对象发送电子邮件验证 createUserWithEmailAndPassword
  2. 只有在您将用户登录到已验证状态后,Firebase 才会return auth 对象的承诺。
  3. 旧的 onAuth 方法已更改为 onAuthStateChanged

检查电子邮件是否已验证:

firebase.auth().onAuthStateChanged(function(user) { 
  if (user.emailVerified) {
    console.log('Email is verified');
  }
  else {
    console.log('Email is not verified');
  }
});

您可以发送验证邮件并检查是否已验证,如下所示进入 AuthListener:

mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();

            if (user != null) {

//---- HERE YOU CHECK IF EMAIL IS VERIFIED

                if (user.isEmailVerified()) {
                    Toast.makeText(LoginActivity.this,"You are in =)",Toast.LENGTH_LONG).show();
                } 

                else {

//---- HERE YOU SEND THE EMAIL

                    user.sendEmailVerification();
                    Toast.makeText(LoginActivity.this,"Check your email first...",Toast.LENGTH_LONG).show();
                }

            } else {
                // User is signed out
                Log.d(TAG, "onAuthStateChanged:signed_out");
            }
            // [START_EXCLUDE]
            updateUI(user);
            // [END_EXCLUDE]
        }
    };

如果您正在使用编译 "com.google.firebase:firebase-auth:9.2.0" 并且 编译 'com.google.firebase:firebase-core:9.2.0' 方法 sendEmailVerification() 在您更新到 9.8.0 或更高版本之前不会被解析。浪费了大半时间才弄明白

创建用户后会返回一个 User 对象,您可以在其中检查用户的电子邮件是否已验证。

当用户尚未验证时,您可以触发用户对象本身的 sendEmailVerification 方法。

firebase.auth()
    .createUserWithEmailAndPassword(email, password)
    .then(function(user){
      if(user && user.emailVerified === false){
        user.sendEmailVerification().then(function(){
          console.log("email verification sent to user");
        });
      }
    }).catch(function(error) {
      // Handle Errors here.
      var errorCode = error.code;
      var errorMessage = error.message;

      console.log(errorCode, errorMessage);
    });

您也可以通过监听 AuthState 来检查,以下方法的问题是,对于每个新会话(通过刷新页面), 已发送一封新电子邮件。

firebase.auth().onAuthStateChanged(function(user) {
  user.sendEmailVerification(); 
});

我也一直在看这个。似乎 firebase 已经改变了您发送验证的方式。对我来说

user.sendEmailVerification() 

没用。 如果您收到诸如 user.sendEmailVerification() 不存在之类的错误。 使用以下内容。

firebase.auth().currentUser.sendEmailVerification()

您可以向其电子邮件链接到 Firebase Auth 帐户的任何用户发送验证电子邮件。例如,在 Flutter 中你可以这样做。像 :

Future<void> signInWithCredentialAndLinkDetails(AuthCredential authCredential,
    String email, String password) async {
  // Here authCredential is from Phone Auth
  _auth.signInWithCredential(authCredential).then((authResult) async {
    if (authResult.user != null) {
      var emailAuthCredential = EmailAuthProvider.getCredential(
        email: email,
        password: password,
      );
      authResult.user
          .linkWithCredential(emailAuthCredential)
          .then((authResult,onError:(){/* Error Logic */}) async {
        if (authResult.user != null) {
          await authResult.user.sendEmailVerification().then((_) {
            debugPrint('verification email send');
          }, onError: () {
            debugPrint('email verification failed.');
          });
        }
      });
    }
  });
}

这不是问题的答案,但可能对某人有所帮助。 不要忘记将您的站点域添加到登录方法下的授权域列表中