问题说明了一切。在Firebase中,如何在用户创建帐户时确认电子邮件,或者就此而言,通过电子邮件重置密码。
我可以更广泛地问:有没有办法从Firebase发送电子邮件?例如。通知等等。这不是你通常会在客户端做的事情。
答案 0 :(得分:47)
<强>更新强>
请注意,这绝不是一种处理电子邮件验证的非常安全的方式,而且由于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;
}
请注意,这是在客户端上发生的,因此恶意用户可能会篡改您的逻辑。
答案 1 :(得分:28)
这需要在firebase之外完成。我将用户存储在/ users /并保持状态(PENDING,ACTIVE,DELETED)。我有一个小服务,监视用户的PENDING状态并发送确认电子邮件。其中包含指向我已创建的用于将用户状态更新为ACTIVE的Web服务的链接。
答案 2 :(得分:22)
[Firebase工程师 - 更新2014-01-27]
Firebase Simple Login现在支持密码重置以进行电子邮件/密码验证。
每个简单登录客户端库都有一个新方法,可以为指定的电子邮件地址生成密码重置电子邮件 - 网络和Android上的sendPasswordResetEmail()
以及iOS上的sendPasswordResetForEmail()
。
此电子邮件将包含一个临时令牌,用户可以使用该令牌登录其帐户并更新其凭据。此令牌将在24小时后或用户更改密码时到期,以先发生者为准。
另请注意,Firebase简单登录可以完整配置电子邮件模板以及发送地址(包括来自您域中的付费帐户的whitelabel电子邮件)。
要访问此功能,您需要将客户端库更新为v1.2.0
或更高版本。要获取最新版本,请查看https://www.firebase.com/docs/downloads.html。
另外,请查看https://www.firebase.com/docs/security/simple-login-email-password.html以获取最新的Firebase简单登录 - Web客户端文档。
答案 3 :(得分:8)
截至2016年7月,您可能不必使用重置链接等。只需使用sendEmailVerification()
and 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
。
答案 4 :(得分:6)
我为解决这个问题所做的是使用Zapier,它有一个内置的firebase API。它检查添加的子元素的位置。然后它从新节点的数据中获取邮件地址和验证URL并将它们向前发送。该网址指向我的角度应用,该应用将用户电子邮件设置为已验证。
当我在firebase中托管我的应用程序文件时,我不需要处理在后台进行轮询的任何服务器或进程。
有延迟,但由于我在验证邮件之前没有阻止用户,所以没问题。 Zapier有一个免费等级,因为我没有太多的流量,所以暂时是一个不错的解决方法。
答案 5 :(得分:1)
新的Firebase SDK v3似乎支持电子邮件地址验证,请参阅here(将您自己的项目ID放在链接中),但它似乎尚未记录。
我在SO here
上提出了问题使用this link to the official docs查看@ SamQuayle的答案。
答案 6 :(得分:0)
我在创建新帐户后使用以下代码检查电子邮件验证。
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.")
}
}
答案 7 :(得分:0)
答案 8 :(得分:-1)
我使用过MandrillApp。您可以创建仅允许发送模板的API密钥。这种方式甚至认为你的密钥暴露它不会真的被滥用,除非有人想要为你发送大量的欢迎电子邮件。
这是一个让自己离开地面的黑客行为。我现在正在从EC2启用CORS,该EC2使用令牌验证用户是否存在,然后通过SES扩展它们。