在学习发送email verification is possible in latest firebase之后,虽然文档遗失了,但我想亲自测试一下。
使用以下代码段:
Auth.$onAuthStateChanged(function(firebaseUser) {
if (firebaseUser) {
console.log(firebaseUser);
if (firebaseUser.emailVerified) {
// console.log(firebaseUser.emailVerified);
toastr.success('Email verified');
} else {
toastr.info('Do verify email');
}
}
})
console.log(firebaseUser.emailVerified)
始终返回false,尽管已启动发送验证,已收到电子邮件并已点击。
使用电子邮件登录后,我会检查用户是否已经过验证,如果没有,则应发送电子邮件:
Auth.$signInWithEmailAndPassword(email, password)
.then(function(firebaseUser) {
if (!firebaseUser.emailVerified) {
firebaseUser.sendEmailVerification();
console.log('Email verification sent');
}
$state.go('home');
})
在我的https://console.firebase.google.com/project/my-app-name/authentication/emails
下,默认情况下一切都是,验证链接为:
Follow this link to verify your email address.
https://my-app-name.firebaseapp.com/__/auth/handler?mode=<action>&oobCode=<code>
我用于注册的电子邮件会收到验证电子邮件,但是,点击该链接不会将user.emailVerified
更改为true。
步骤大纲是here所有内容,还是在文档中找不到另一个步骤?
答案 0 :(得分:4)
如@Tope评论,您需要执行firebaseUser.reload()以更新firebaseUser的身份验证状态。
答案 1 :(得分:2)
我采取了同样的步骤:
auth.currentUser.emailVerified
假
auth.currentUser.sendEmailVerification()
然后
auth.currentUser.emailVerified
真
注意步骤3和4:在我的应用中显示emailVerified
的新值之前,我需要再次登录。
这个答案似乎也很重要,但我在写完上述内容后才发现它:Firebase confirmation email not being sent
答案 2 :(得分:2)
以非常简约的方式,这就是我最终的结果:
angular.module('theApp')
.controller('emailVerifyController', ['$scope', '$stateParams', 'currentAuth', 'DatabaseRef',
function($scope, $stateParams, currentAuth, DatabaseRef) {
// where currentAuth and DatabaseRef is what they sound like
$scope.doVerify = function() {
firebase.auth()
.applyActionCode($stateParams.oobCode)
.then(function(data) {
// change emailVerified for logged in User
// you can update a DatabaseRef endpoint in here
// whatever!
toastr.success('Verification happened', 'Success!');
})
.catch(function(error) {
$scope.error = error.message;
toastr.error(error.message, error.reason, { timeOut: 0 });
})
};
}
])
然后在模板中,像这样:
<a ng-click="doVerify()" class="button large">Verify my Account</a>
虽然applyActionCode
尚未包含在AngularFire中,但您仍然可以在AngularJS中删除SDK的vanilla Javascript,此外,为什么不呢!
我在Firebase中分享了有关电子邮件验证的更多详细信息:
https://blog.khophi.co/email-verification-firebase-3-0-sdk/
答案 3 :(得分:0)
我们刚刚经历了同样的问题,发现解决方法是既使用def make_bricks(ones, fives, length):
total_fives = 5 * fives
fives_needed = length // 5
if ones>=length or length%5 ==0 and total_fives >=length: return True
elif fives_needed<=fives and (length - fives_needed * 5)<=ones: return True
elif fives_needed>fives and total_fives + ones >= length: return True
else: return False
make_bricks(3, 1, 8)
True
make_bricks(3, 1, 9)
False
make_bricks(3, 2, 10)
True
函数重新加载用户,又将观察者从user.reload()
更改为onAuthStateChanged
。
这是因为您正在使用新的onIdTokenChanged
属性更新firebase令牌,而emailVerifed
正在侦听对ID令牌的更改,并使用正确的值更新用户对象。
代码段:
onIdTokenChanged
答案 4 :(得分:0)
我们只需要在用户单击用户确认链接后重新加载用户的状态即可。尤其是如果有人在使用Firebase UI登录流程,则可能已经注意到用户登录和登录同时执行。对于这种情况,需要通过注销登录来重新认证用户,这不是一种令人愉快的体验。但是,Firebase提供了重新加载用户的选项。将其放在async-await函数中将确保在执行下一个命令之前刷新状态。
async function confirmEmailVerified(){
await auth.currentUser.reload();
var isEmailVerified = auth.currentUser.emailVerified;
if (isEmailVerified) {
console.log("Email verified");
}else{
console.log("Email not verified, please verify or click on resend to get the verification email!");
}
}
答案 5 :(得分:0)
就我而言,似乎(base) [xushan@int2 southfr_exp]$ srun job_spinup.sh southfr_exp 1 &
[1] 11570
(base) [xushan@int2 southfr_exp]$ srun: job 8860513 queued and waiting for resources
srun: job 8860513 has been allocated resources
***************************************
CONDA ENV ACTIVATED FOR NCO COMMAND
***************************************
20
./job_spinup.sh: line 62: ulimit: open files: cannot modify limit: Operation not permitted
***************************************
READY TO START SPINUP on tcn991.bullx
spinup 20 0:1
***************************************
------------------
SPINUP : 0 / 20
199601
1
199602
1
199603
1
199604
1
199605
1
199606
1
199607
1
199608
1
199609
1
199610
1
199611
1
199612
1
------------------
------------------
SPINUP : 1 / 20
199601
1
199602
1
199603
1
199604
1
199605
1
199606
1
199607
1
199608
1
199609
1
199610
1
srun: Force Terminated job 8860513
srun: Job step aborted: Waiting up to 32 seconds for job step to finish.
slurmstepd: error: *** STEP 8860513.0 ON tcn991 CANCELLED AT 2020-09-07T12:51:24 DUE TO TIME LIMIT ***
srun: error: tcn991: task 0: Terminated
srun: Terminating job step 8860513.0
切换到currentUser.emailVerified
,但并非总是如此。不知道为什么。在大多数情况下,Chrome会切换为true
,但并非总是如此。 Firefox不支持。
应用true
方法似乎可以解决此问题。
在加载包含oobCode的URL之后,我有了一个传奇:
reload()