Есть ли способ сделать подтверждение электронной почты для создания пользователя Firebase и / или сброса пароля?

вопрос все сказано. В Firebase как подтвердить электронную почту, когда пользователь создает учетную запись, или, если на то пошло, сбросить пароль по электронной почте.

Я мог бы спросить более широко: есть ли способ отправить электронные письма из Firebase? Е. Г. уведомления и т. д. Это не то, что вы обычно делаете на стороне клиента.

9 ответов


Это должно быть сделано за пределами базы. Я храню пользователей в /users/ и сохраняю на них статус (ожидающий, активный, удаленный). У меня есть небольшая служба, которая отслеживает пользователей ожидающего статуса и отправляет электронное письмо с подтверждением. Который имеет ссылку на веб-сервис, который я создал, чтобы обновить статус пользователя до активного.


обновление

обратите внимание, что это никогда не был очень безопасный способ обработки проверки электронной почты, и поскольку Firebase теперь поддерживает проверку электронной почты, его, вероятно, следует использовать вместо этого.

оригинальный ответ

Я решил проверку электронной почты с помощью сброса пароля.

при создании учетной записи я даю пользователю временный (случайно сгенерированный) пароль. Затем я запускаю сброс пароля, который отправит электронное письмо пользователю со ссылкой. Ссылка позволит пользователю установить новый пароль.

для генерации случайного пароля вы можете использовать код, подобный этому:

function () {
  var possibleChars = ['abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?_-'];
  var password = '';
  for(var i = 0; i < 16; i += 1) {
    password += possibleChars[Math.floor(Math.random() * possibleChars.length)];
  }
  return password;
}

обратите внимание, что это происходит на клиенте, поэтому злоумышленник может подделать вашу логику.


[инженер на Firebase-обновление 2014-01-27]

Firebase Simple Login теперь поддерживает сброс пароля для аутентификации по электронной почте / паролю.

каждой из клиентских библиотек Simple Login был предоставлен новый метод генерации писем сброса пароля для указанного адреса электронной почты -sendPasswordResetEmail() в интернете и Android, и sendPasswordResetForEmail() на iOS.

Это письмо будет содержать временный токен, который пользователь может использовать для входа в свою учетную запись и обновления полномочия. Этот токен истечет через 24 часа или когда пользователь изменит свой пароль, в зависимости от того, что произойдет первым.

также обратите внимание, что Firebase Simple Login позволяет полностью настроить шаблон электронной почты, а также адрес отправки (включая электронную почту whitelabel с вашего домена для платных учетных записей).

чтобы получить доступ к этой функции, вам необходимо обновить клиентскую библиотеку до версии v1.2.0 или больше. Чтобы получить последнюю версию, проверьте https://www.firebase.com/docs/downloads.html.

кроме того, проверьте https://www.firebase.com/docs/security/simple-login-email-password.html для последней Firebase простой вход-веб-клиент документы.


по состоянию на июль 2016 года вам, возможно, не придется использовать ссылку сброса и т. д. Просто используйте sendEmailVerification() и applyActionCode функции:

короче говоря, ниже в основном, как вы будете подходить к этому, в AngularJS:

// thecontroller.js
$scope.sendVerifyEmail = function() {
    console.log('Email sent, whaaaaam!');
    currentAuth.sendEmailVerification();
  }

// where currentAuth came from something like this:
// routerconfig

....
templateUrl: 'bla.html',
resolve: {
    currentAuth:['Auth', function(Auth) {
      return Auth.$requireSignIn() // this throws an AUTH_REQUIRED broadcast
    }]
  }
...

// intercept the broadcast like so if you want:

....

$rootScope.$on("$stateChangeError", function(event, toState, toParams, fromState, fromParams, error) {
      if (error === "AUTH_REQUIRED") {
        $state.go('login', { toWhere: toState });
       }
    });
....

// So user receives the email. How do you process the `oobCode` that returns?
// You may do something like this:

// catch the url with its mode and oobCode
.state('emailVerify', {
  url: '/verify-email?mode&oobCode',
  templateUrl: 'auth/verify-email.html',
  controller: 'emailVerifyController',
  resolve: {
    currentAuth:['Auth', function(Auth) {
      return Auth.$requireSignIn()
    }]
  }
})

// Then digest like so where each term is what they sound like:

.controller('emailVerifyController', ['$scope', '$stateParams', 'currentAuth', 'DatabaseRef',
  function($scope, $stateParams, currentAuth, DatabaseRef) {
    console.log(currentAuth);
    $scope.doVerify = function() {
      firebase.auth()
        .applyActionCode($stateParams.oobCode)
        .then(function(data) {
          // change emailVerified for logged in User
          console.log('Verification happened');
        })
        .catch(function(error) {
          $scope.error = error.message;
          console.log(error.message, error.reason)
        })
    };
  }
])

и ooh, с вышеуказанным подходом, я не думаю, что есть необходимость держать проверку электронной почты вашего пользователя в области пользовательских данных. The applyActionCode изменения emailVerified до true С false.

проверка электронной почты очень важно когда пользователи входят в локальную учетную запись. Однако для многих социальных аутентификаций входящие emailVerified будет true уже.

объяснил подробнее в статье проверка электронной почты с Firebase 3.0 SDK


то, что я сделал, чтобы обойти это, было использование Zapier, который имеет встроенный API для firebase. Он проверяет местоположение добавленных дочерних элементов. Затем он берет почтовый адрес и url-адрес проверки из данных новых узлов и отправляет их вперед. Url-адрес указывает на мое приложение angular, которое устанавливает электронную почту пользователя как проверенную.

поскольку я размещаю свои файлы приложений в firebase, мне не нужно заботиться о каких-либо серверах или процессах, выполняющих опрос в фоновом режиме.

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


новый Firebase SDK v3, похоже, поддерживает проверку адреса электронной почты, см. здесь (поместите свой собственный идентификатор проекта в ссылку), но он еще не задокументирован.

Я задал вопрос на SO здесь

см. ответ @SamQuayle там с это ссылка на официальные документы.


я использовал следующий код для проверки проверка электронной почты после создания новой учетной записи.

let firAuth = FIRAuth.auth()
firAuth?.addAuthStateDidChangeListener { auth, user in
    if let loggedUser = user {

        if loggedUser.emailVerified == false {

            loggedUser.sendEmailVerificationWithCompletion({ (error) in

                print("error:\(error)")
            })
        }
        else {

            print(loggedUser.email)
        }
    } else {
        // No user is signed in.
        print("No user is signed in.")
    }
}

Как отметили различные другие Firebase теперь поддерживает электронную почту, связанную с учетной записью, но еще лучше, начиная с 10 дней назад или около того, он также поддерживает отправку любого вида электронной почты через функции Firebase. Много деталей в docs и пример кода здесь.


Я MandrillApp. Вы можете создать ключ API, который позволяет отправлять шаблона. Таким образом, даже если ваш ключ разоблачен, его нельзя злоупотреблять, если кто-то не хочет запустить тонны приветственных писем для вас.

Это был взлом, чтобы оторваться от Земли. Теперь я включаю CORS из EC2, который использует токен, чтобы проверить, что пользователь существует, прежде чем расширять их приветствие через SES.