firebase-ui для проверки электронной почты

Я успешно настроил аутентификацию по электронной почте / паролю Firebase с помощью firebase-ui.

 var uiConfig = {
        signInSuccessUrl: '<?php echo $url; ?>',
        signInOptions: [
            // Leave the lines as is for the providers you want to offer your users.
            firebase.auth.GoogleAuthProvider.PROVIDER_ID,
            firebase.auth.FacebookAuthProvider.PROVIDER_ID,
            firebase.auth.EmailAuthProvider.PROVIDER_ID
        ],
        // Terms of service url.
        tosUrl: '<your-tos-url>'
    };

    // Initialize the FirebaseUI Widget using Firebase.
    var ui = new firebaseui.auth.AuthUI(firebase.auth());
    // The start method will wait until the DOM is loaded.
    ui.start('#firebaseui-auth-container', uiConfig);

но по соображениям безопасности я хочу, чтобы пользователь подтвердил свой адрес электронной почты. Но из приведенного выше кода он не отправляет пользователю письмо с подтверждением. Итак, я использовал следующий метод, чтобы отправить пользователю письмо с подтверждением, если он / она не подтвердили почту своей учетной записи.

firebase.auth().onAuthStateChanged(function(user) {
    if (user && user.uid != currentUid) {
        if (firebase.auth().currentUser.emailVerified) {
            currentUid = user.uid;

        else {
        //---- HERE YOU SEND THE EMAIL
            firebase.auth().currentUser.sendEmailVerification();
            }

Но когда я использовал этот код, он отправляет несколько писем с подтверждением для одной и той же учетной записи. Это означает, что этот метод запускается каждый раз, когда пользователь перезагружает страницу. Было бы действительно здорово, если бы кто-нибудь мог помочь мне определить, отправлено ли проверочное письмо для конкретного пользователя с помощью firebase.


person Shelly    schedule 14.04.2017    source источник
comment
Firebase Authentication не отслеживает, было ли уже отправлено письмо с подтверждением на адрес. Он просто отправляет (в разумных пределах) электронное письмо, когда вы звоните sendEmailVerification(). Если вы хотите ограничить эту отправку, вам придется реализовать механизм для этого самостоятельно.   -  person Frank van Puffelen    schedule 14.04.2017
comment
Спасибо за ответ, Фрэнк. Есть ли возможность отправить подтверждение по электронной почте с помощью firebase-ui в момент создания новой учетной записи?   -  person Shelly    schedule 14.04.2017
comment
Кажется, что sendEmailVerification() вызывается только в тестовом коде (одно из преимуществ FirebaseUI с открытым исходным кодом заключается в том, что вы можете искать такие вещи самостоятельно), поэтому это не похоже на функцию. Уже есть запрос функции для этого, так что вы можете захотеть перезвонить / голосуйте там.   -  person Frank van Puffelen    schedule 14.04.2017
comment
Почему бы вам не отправить электронное письмо, когда они зарегистрируются? После этого, если они не прошли проверку, покажите сообщение, которое они должны подтвердить, или повторно отправьте электронное письмо (в виде кнопки / ссылки). Раньше я не использовал библиотеку пользовательского интерфейса, так как использовать API напрямую, но, надеюсь, после регистрации будет обратный вызов.   -  person Dominic    schedule 04.06.2018


Ответы (3)


Я опаздываю, но если кто-то найдет его, как я:

if(currentUser.metadata.creationTime === currentUser.metadata.lastSignInTime)

Верно, если это новый пользователь, поэтому вам необходимо отправить письмо с подтверждением. Вы также можете сделать это в signInSuccess, не нужно смотреть onAuthStateChanged

person user2329440    schedule 04.06.2018
comment
Использование creationTime/lastSignInTime из onAuthStateChanged, похоже, не работает. Если пользователь, например, перезагружает страницу, скорее всего, электронное письмо будет отправлено снова, потому что оно не считается новым входом в систему. - person Louis Semprini; 17.03.2019
comment
... Использование creationTime/lastSignInTime с signInSuccessWithAuthResult должно работать, но есть способ лучше: см. Мой ответ в этом вопросе SO. - person Louis Semprini; 17.03.2019

Я нашел то, что кажется лучшим ответом на эту едва задокументированную (для JavaScript) проблему Firebase в примере кода здесь:

  // FirebaseUI config.
  var uiConfig = {
    callbacks: {
      signInSuccessWithAuthResult: function(authResult, redirectUrl) {

        var user = authResult.user;
        ...
        if (authResult.additionalUserInfo.isNewUser)
        {
            console.log("new signin");
            user.sendEmailVerification();
        }
        ...
        return true;
      },

Наслаждайтесь!

person Louis Semprini    schedule 17.03.2019

Вы можете использовать обратный вызов SignInSuccessWithAuthResult для отправки подтверждения по электронной почте. Что вам нужно сделать, так это предоставить функцию обратного вызова и проверить, подтвердил ли пользователь электронную почту, если нет, sendEmailVerification.

person Ti Wang    schedule 05.06.2018