【问题标题】:Angular function getIdToken is not a function errorAngular 函数 getIdToken 不是函数错误
【发布时间】:2020-06-28 08:37:07
【问题描述】:

我正在尝试使用 Firebase 身份验证设置 Angular 应用程序。 我现在的目标是在应用初始化期间获取客户端用户的令牌和数据。

在 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 is not a function” 请问有什么建议吗?谢谢转发。

【问题讨论】:

    标签: angular firebase firebase-authentication


    【解决方案1】:

    当您将对象存储在localStorage 中时,它会被序列化。您不能像这样存储 firebase User 对象。而且也没有必要,因为 firebase 有自己的 state persistence 内置。

    你需要设置:

    firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL)
    

    表示即使在 React Native 中关闭浏览器窗口或销毁 Activity 时,状态也会保持不变。需要显式注销才能清除该状态。请注意,Firebase 身份验证网络会话是单一主机来源的,并且只会针对单个域持续存在。

    你也可以考虑使用官方的 @angular/fire 包,它有很好的 observables 并且是专门为 angular 制作的

    【讨论】:

    • 感谢您的提示。我正在使用@angular/fire ...但是从您的回答中我仍然不知道如何在应用程序初始化期间正确获取令牌。我只需要对令牌结果的承诺,而不是用令牌观察到的。
    • 好的,我找到了结合设置 Persistence 和使用 onAuthStateChanged 获得 Promise 的解决方案
    • @emihud right :) 很高兴我能帮上一点忙,很高兴你自己找到了!
    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2020-12-30
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    相关资源
    最近更新 更多