AuthGuard:OnAuthStateChanged VS 在 Angular 5 + Firebase 中检查令牌

AuthGuard: OnAuthStateChanged VS check token in Angular 5 + Firebase

每次用户注册,执行以下代码:

this.router.navigate(['/']);
firebase.auth().currentUser.getToken()
   .then(
      (token: string) => this.token = token
    )

getToken方法是这样定义的:

getToken() {
   firebase.auth().currentUser.getToken()
     .then(
       (token: string) => this.token = token
      );
   return this.token;
}

我保存了令牌,因为我有一个用于检查用户是否拥有令牌的路由守卫:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
   return this.authService.isAuthenticated();
}

现在,我刚刚阅读了 Firebase 的文档,这是使用 onAuthStateChanged() 检查用户是否已登录的好习惯:

firebase.auth().onAuthStateChanged(function(user) {
   if (user) {
      // User is signed in.
   } else {
      // No user is signed in.
   }
});

那么,定义(有效)用户是否使用 Angular + Firebase 登录应用程序的最佳方法是什么?

我使用此功能来检查用户是否登录(使用 angularfire2,这很有帮助,因为它以 Angular 方式为您提供包装器到 firebase js sdk https://github.com/angular/angularfire2):

isLoggedIn(){

var promise = new Promise((resolve, reject) => {

  this.afAuth.authState.subscribe(res => {
    if (res && res.uid) {
      console.log('user is logged in');
      resolve(true);
    } else {
      console.log('user not logged in');
      resolve(false);
    }
  });
});

return promise;

}

函数的使用方式如下:

this.auth.isLoggedIn().then(
    (val) => {
      if(val){

        //Do your re-direct

      }else{
        //send alert or something
      }
    }
);