Есть ли способ сделать подтверждение электронной почты для создания пользователя 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.")
}
}
Я MandrillApp. Вы можете создать ключ API, который позволяет отправлять шаблона. Таким образом, даже если ваш ключ разоблачен, его нельзя злоупотреблять, если кто-то не хочет запустить тонны приветственных писем для вас.
Это был взлом, чтобы оторваться от Земли. Теперь я включаю CORS из EC2, который использует токен, чтобы проверить, что пользователь существует, прежде чем расширять их приветствие через SES.