我用于保存用户信息的代码,在授权服务文件中的10个使用Angular身份验证的示例中,有9个是这样的:
constructor(
public afAuth: AngularFireAuth, // Inject Firebase auth service
private router: Router
) {
this.afAuth.authState.subscribe(user => {
if (user) {
alert('subscribe' + user);
this.userData = user;
localStorage.setItem('user', JSON.stringify(this.userData));
} else {
localStorage.setItem('user', null);
}
})
}
这是我访问本地存储的方式,例如在isLoggedIn方法中:
get isLoggedIn(): boolean {
const user = JSON.parse(localStorage.getItem('user'));
return (user !== null && user.emailVerified !== false) ? true : false;
}
收到上述消息后,用户为NULL。
这是调用此方法的地方(警卫队):
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router} from '@angular/router';
import { Observable } from 'rxjs';
import { AuthService } from '../services/auth.service';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(
public authService: AuthService,
public router: Router
) {}
/* Secure your app�s routes from unauthorized access using canActivate() route guard method.
This method is pretty helpful when we need to secure our app�s URL.*/
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
if (this.authService.isLoggedIn !== true) {
this.router.navigate(['login']);
}
return true;
}
}
这是我得到的解决方法,由于我提到的每个示例都使用上面的“订阅”解决方案,因此我不确定这是最好的解决方法:
public get currentUser(): firebase.User {
return this.afAuth.auth.currentUser;
}
问题:登录后,当我的程序访问localstorage时为null。然后,我再次登录并工作。好像订阅发生的时间比我的登录晚(异步?)。它可以工作,但是已经很晚了,因为它第一次返回null。
如果您从上方看,我会发出警报:alert('subscribe' + user)
。我得到了警报,但是正如我所说,“反应”需要一段时间。我需要在登录后但尝试访问本地存储之前进行该操作。
我对Angular,Javascript和Firabase完全陌生。
谢谢。