我为Angular 2应用程序构建了身份验证。我通过使用Firebase身份验证服务实现了这一目标。重新加载页面后,用户将被注销,但令牌仍然存在于localStorage中。
这是我的代码:
export class AdminService {
email;
password;
error;
invalidLogin;
isLoggedIn = false;
constructor(private af: AngularFireAuth,private router: Router,private route: ActivatedRoute) {
}
login(){
this.af.auth.signInWithEmailAndPassword(this.email,this.password)
.then(authState => {
if(authState){
let returnUrl = this.route.snapshot.queryParamMap.get('returnUrl');
this.router.navigate([returnUrl||'/']);
this.isLoggedIn = true;
}
else this.invalidLogin = true;
})
}
logout(){
this.af.auth.signOut();
this.isLoggedIn = false;
this.router.navigate(['/'])
}
}
答案 0 :(得分:1)
用户实际上并没有退出。重新加载页面时,Firebase客户端会检测本地存储中的信息并再次对用户进行签名。您的代码无法检测到这一点,因此无法正确路由用户。
在常规Firebase JavaScript客户端中,您可以通过listening for the onAuthStateChanged()
event解决此问题:
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// User is signed in.
} else {
// No user is signed in.
}
});
在AngularFire2中有一个FirebaseIdTokenObservable
that exposes an Observable<firebase.User>
。虽然我承认我从来没有使用它,但这似乎也是这样做的。