Есть ли способ сделать подтверждение по электронной почте для создания пользователей Firebase и/или пароля reset?
Вопрос говорит все. В Firebase, как мне подтвердить адрес электронной почты, когда пользователь создает учетную запись или, если на то пошло, выполняет пароль reset по электронной почте.
Я мог бы попросить более широко: есть ли способ отправить электронные письма из Firebase? Например. уведомления и т.д. Это не то, что вы обычно делаете на стороне клиента.
Ответы
Ответ 1
Это нужно сделать за пределами firebase. Я храню пользователей в/users/и сохраняю статус на них (PENDING, ACTIVE, DELETED). У меня есть небольшой сервис, который контролирует пользователей статуса PENDING и отправляет электронное письмо с подтверждением. У меня есть ссылка на веб-сервис, который я создал для обновления статуса пользователя ACTIVE.
Ответ 2
Обновление
Обратите внимание, что это никогда не был очень безопасным способом обработки электронной почты, и поскольку Firebase теперь поддерживает проверку электронной почты, скорее всего, это должно быть использовано.
Оригинальный ответ
Я решил проверку электронной почты с помощью функции пароля reset.
При создании учетной записи я предоставляю пользователю временный (случайно сгенерированный) пароль. Затем я запускаю пароль reset, который отправит электронное письмо пользователю со ссылкой. Ссылка позволит пользователю установить новый пароль.
Для генерации случайного пароля вы можете использовать код, похожий на этот:
function () {
var possibleChars = ['abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?_-'];
var password = '';
for(var i = 0; i < 16; i += 1) {
password += possibleChars[Math.floor(Math.random() * possibleChars.length)];
}
return password;
}
Обратите внимание, что это происходит на клиенте, поэтому злоумышленник может нарушить вашу логику.
Ответ 3
[Инженер в Firebase - Обновление 2014-01-27]
Firebase Simple Login теперь поддерживает сброс пароля для аутентификации по электронной почте/паролю.
Каждой из клиентских библиотек Simple Login был предоставлен новый метод для генерации паролей reset для указанного адреса электронной почты - sendPasswordResetEmail()
в Интернете и Android и sendPasswordResetForEmail()
на iOS.
Это электронное письмо будет содержать временный токен, который пользователь может использовать для входа в свою учетную запись и обновления своих учетных данных. Этот токен истекает через 24 часа или когда пользователь меняет свой пароль, в зависимости от того, что наступит раньше.
Также обратите внимание, что Firebase Simple Login позволяет полностью настраивать шаблон электронной почты, а также адрес отправки (включая белый цвет электронной почты из вашего домена для платных учетных записей).
Чтобы получить доступ к этой функции, вам необходимо обновить свою клиентскую библиотеку до версии v1.2.0
или выше. Чтобы захватить последнюю версию, проверьте https://www.firebase.com/docs/downloads.html.
Кроме того, ознакомьтесь с https://www.firebase.com/docs/security/simple-login-email-password.html для последних документов Firebase Simple Login - Web Client.
Ответ 4
Как и в 2016 году, вам может не понадобиться использовать ссылку reset и т.д. Просто используйте функции 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)
})
};
}
])
И оооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо applyActionCode
изменяет emailVerified
на true
с false
.
Проверка электронной почты важна, когда пользователи вступают в систему с локальной учетной записью. Однако для многих социальных аутентификаций входящий emailVerified
уже будет true
.
Объяснено в статье Проверка электронной почты с помощью Firebase 3.0 SDK
Ответ 5
Что я сделал, чтобы обойти это, было использование Zapier, у которого встроенный API для firebase. Он проверяет местоположение для добавления дочерних элементов. Затем он берет адрес электронной почты и URL-адрес проверки из данных новых узлов и отправляет их вперед. URL-адрес указывает на мое приложение angular, которое устанавливает электронную почту пользователя как подтвержденное.
Когда я размещаю файлы приложений в firebase, мне не нужно заботиться о любых серверах или процессах, делающих опрос в фоновом режиме.
Есть задержка, но поскольку я не блокирую пользователей, прежде чем проверять почту, это нормально. У Zapier есть свободный уровень, и поскольку у меня нет большого трафика, это достойное решение на время.
Ответ 6
Новый Firebase SDK v3, похоже, поддерживает проверку адреса электронной почты, см. здесь (поместите свой собственный идентификатор проекта в ссылку), но он не 't, кажется, документирован еще.
Я задал вопрос о SO здесь
См. @SamQuayle, ответьте там эту ссылку на официальные документы.
Ответ 7
Я использовал следующий код для проверки проверки электронной почты после создания новой учетной записи.
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.")
}
}
Ответ 8
Как отмечают другие, Firebase теперь поддерживает электронные письма, связанные с учетной записью, но еще лучше, по состоянию на 10 дней назад или так же поддерживает отправку любого вида электронной почты через Firebase Functions. Много деталей в docs и пример кода здесь.
Ответ 9
Я использовал MandrillApp. Вы можете создать ключ API, который позволяет отправлять только шаблон. Этот способ даже думал, что ваш ключ разоблачен, его нельзя действительно злоупотреблять, если кто-то не хочет увольнять тонны приветственных писем для вас.
Это был взлом, чтобы убрать меня с ног. Теперь я разрешаю CORS из EC2, который использует токен, чтобы проверить, существует ли пользователь, прежде чем расширять их приветствием через SES.