我正在尝试使用Firebase身份验证设置Angular应用程序。 我现在的目标是在App初始化期间获取客户端用户的令牌和数据。
在App模块中,我将AuthServise设置为APP_INITIALIZER
providers: [
AuthService,
{
provide: APP_INITIALIZER,
useFactory:loadAuthService ,
deps: [AuthService],
multi: true
},
export function loadAuthService(authService: AuthService): Function
{
return () => { return authService.load() };
}
我的带有“加载”功能的AuthService看起来像这样
private _token: BehaviorSubject<string> = new BehaviorSubject<string>(null);
private _fUser: BehaviorSubject<firebase.User> = new BehaviorSubject<firebase.User>(null);
// Returns true when user is looged in localStorage of the client
get isLoggedIn(): boolean {
return (this.localStorageUser !== null) ? true : false;
}
get localStorageUser(): firebase.User {
return JSON.parse(localStorage.getItem('user'));
}
get token(): string {
return this._token.getValue();
}
set token(token: string) {
this._token.next(token);
}
get fUser(): firebase.User {
return this._fUser.getValue();
}
set fUser(fUser: firebase.User){
this._fUser.next(fUser);
}
/**
* Called and waited on during app initialiation.
* Initializing app with auth service
*/
public async load()
{
console.log('Initializing app with auth service');
//Check whether user is in client's local storage
if (this.isLoggedIn){
this.fUser = this.localStorageUser;
const userRef: AngularFirestoreDocument<any> = this.afs.doc(`users/${this.fUser.uid}`);
try {
this.token = await this.fUser.getIdToken();
} catch (error) {
console.log('getting token error', error);
}
}
}
我不知道为什么我收到错误消息“ this.fUser.getIdToken不是函数” 有什么建议吗?谢谢你。
答案 0 :(得分:2)
将对象存储在localStorage
中时,它会被序列化。您不能像这样存储firebase User
对象。而且也没有必要,因为firebase内置了自己的state persistence。
您需要设置:
firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL)
指示即使在浏览器窗口关闭或Activity在React Native中被破坏时,状态也将保持不变。需要明确注销才能清除该状态。请注意,Firebase Auth Web会话是单个主机来源的,并且只会在单个域中保留。
您还可以考虑使用官方的@angular/fire
软件包,该软件包具有很好的可观察性,并且专门针对有角度的容器