有没有办法为Firebase用户创build和/或密码重置做电子邮件确认?
问题说明了一切。 在Firebase中,如何在用户创build帐户时确认电子邮件,或者通过电子邮件进行密码重置。
我可以更广泛地问:有没有办法从Firebase发送电子邮件? 例如通知等。这不是你通常做客户端的事情。
这需要在Firebase之外完成。 我将用户存储在/ users /并保持其状态(PENDING,ACTIVE,DELETED)。 我有一个servlets,监视用户的待办状态,并发出确认电子邮件。 其中有一个链接到我已经创build的Web服务,以更新用户状态为ACTIVE。
更新
请注意,这不是一个处理电子邮件validation的非常安全的方式,由于Firebase现在支持电子邮件validation,因此应该使用它。
原始答案
我使用密码重置function解决了电子邮件validation。
在创build账户时,我给用户一个临时的(随机生成的)密码。 然后,我会触发一个密码重置,将通过链接发送一封电子邮件给用户。 该链接将允许用户设置一个新的密码。
要生成随机密码,您可以使用类似于以下的代码:
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简单login现在支持用于电子邮件/密码身份validation的密码重置。
每个简单login客户端库都有一个用于为指定电子邮件地址生成密码重置电子邮件的新方法 – 在Web和Android上为sendPasswordResetForEmail()
在iOS上为sendPasswordResetForEmail()
。
该电子邮件将包含一个临时令牌,用户可以使用该令牌login其帐户并更新其凭据。 此令牌将在24小时后或用户更改其密码(以先发生者为准)后过期。
另请注意,Firebase简单loginfunction可以全面configuration电子邮件模板以及发送地址(包括来自您所在域的白标签电子邮件,用于付费帐户)。
要访问此function,您需要将客户端库更新到v1.2.0
或更高版本。 要获取最新版本,请查看https://www.firebase.com/docs/downloads.html 。
另外,请查阅https://www.firebase.com/docs/security/simple-login-email-password.html获取最新的Firebase简单login – Web客户端文档。
截至2016年7月,您可能不必使用重置链接等。只需使用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) }) }; } ])
而且,用上面的方法,我不认为有必要在用户数据区域中保存用户电子邮件的validation。 applyActionCode
将emailVerified
从false
更改为true
。
用户使用本地帐户login时,电子邮件validation非常重要。 但是,对于许多社交authentication,传入的emailVerified
已经是true
了。
在使用Firebase 3.0 SDK进行电子邮件validation的文章中进行了更多解释
我为解决这个问题所做的是使用Zapier,它有一个内置的firebase API。 它检查添加的子元素的位置。 然后从新节点的数据中获取邮件地址和validationURL,并将其发送出去。 该url指向我的angular度应用程序,它将用户电子邮件设置为已validation。
当我在firebase中托pipe我的应用程序文件时,我不需要照顾任何服务器或进程在后台进行轮询。
有一个延迟,但因为我没有阻止用户在validation邮件之前没有问题。 Zapier有一个免费的层,因为我没有太多的stream量,这是一个体面的解决方法暂时。
新的Firebase SDK v3似乎支持电子邮件地址validation,请参阅此处 (将自己的项目ID放在链接中),但似乎尚未logging。
我在这里问过这个问题
请参阅@ SamQuayle的答案与官方文档的链接 。
我使用以下代码在创build新帐户后检查电子邮件validation。
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函数发送任何types的电子邮件。 这里的文档和示例代码中有大量的细节。
我使用MandrillApp。 您可以创build一个只允许发送模板的API密钥。 这种方式甚至认为你的钥匙是暴露的,它不能真的被滥用,除非有人想为你发出大量的欢迎电子邮件。
这是一个黑客让自己离开地面。 现在,我正在使用令牌的EC2启用CORS,以validation用户是否存在,然后通过SES扩展它们的欢迎。