【问题标题】:How do I get the current user's access token in AngularFire2?如何在 AngularFire2 中获取当前用户的访问令牌?
【发布时间】:2017-02-23 19:43:21
【问题描述】:

在 AngularFire 中,您可以为经过身份验证的用户访问提供商(例如 Google)accessToken。

似乎没有办法使用 AngularFire2 访问它?

在初始登录时这样说:

this.af.auth.subscribe(user=> {
  if (user) {
    console.log(user.google);
  }
});

它会注销 idToken、accessToken、provider、 但是(在页面刷新时)随后将注销标准详细信息(uid、displayName 等....) 并且 accessToken 不是可访问的属性?

有没有办法访问当前用户的accessToken?

【问题讨论】:

    标签: javascript firebase firebase-authentication angularfire2


    【解决方案1】:

    getToken 现已弃用。你应该改用getIdToken

    this.af.auth.currentUser.getIdToken(true)
      .then((token) => localStorage.setItem('tokenId', token));
    

    【讨论】:

    • 我将“true”传递给 getIdToken,但令牌没有强制更新。我用 2 diff 帐户登录。有什么建议?谢谢。
    【解决方案2】:

    只有在用户首次登录时才能访问访问令牌。来自Firebase migration guide for web developers

    借助 Firebase.com 身份验证 API,您可以轻松地使用提供商的访问令牌调用提供商的 API 并获取更多信息。此访问令牌仍然可用,但仅在登录操作完成后立即可用。

    var auth = firebase.auth();
    
    var provider = new firebase.auth.GoogleAuthProvider();
    auth.signInWithPopup(provider).then(function(result) {
      var accessToken = result.credential.accessToken;
    });
    

    所以它确实在页面刷新时不可用。如果您希望它保持可用,您需要自己持久化它。

    【讨论】:

    • 不,遗憾的是这不适用于 AngularFire2 库。
    • 是的,我也不明白。看起来login() 解析的数据与signInWithPopup() 不同。
    • 最后我只是使用 Firebase SDK 获取令牌,然后将其保存在 localStorage 中。我发现我不必立即初始化 AngularFire2,因为它有点古怪(如果当前用户仍在 Firebase 的身份验证期内),然后可能稍后延迟加载它(AngularFire2)。
    • 您最后是如何使用 Firebase Native SDK 的?我正在努力完成这项工作,因为 AngularFire2 登录方法似乎真的修改了原来的方法。
    【解决方案3】:

    使用 AngularFire2,您可以像这样获得令牌:

    this.af.auth.getToken() // returns a firebase.Promise<any>
    

    如果您想获得 ES6 Promise,只需使用

    Promise.resolve()
      .then(() => this.af.auth.getToken() as Promise<string>)
    

    【讨论】:

      【解决方案4】:

      这对我有用:

      this.af.auth.getAuth().auth.getToken(false);//true if you want to force token refresh
      

      你可以把它放到一个服务中,然后你就可以像这样得到令牌:

      this.authService.getToken().then(
        (token) => console.debug(`******** Token: ${token}`));
      

      【讨论】:

      • 这是 getAuth() 的问题......自从添加对 Firebase 3 的支持以来,getAuth() API 的行为发生了变化。这将在页面加载时返回 null 作为初始值,即使如果用户实际登录。请通过订阅 auth 服务异步观察实际的 authState:af.auth.subscribe()。 getAuth 方法将在以后的版本中移除
      • 我知道文档是这么说的,但我的解决方案运行良好。唯一的问题是警告提及这将在未来如您所说的那样工作,但不要担心,因为在那一刻将存在其他新方法或替代解决方案可供使用。
      【解决方案5】:

      从 angularfire2 中的存储中获取身份验证令牌

      JSON.parse(JSON.stringify(this.afAuth.auth.currentUser)).stsTokenManager.accessToken
      

      如本次讨论所示: https://github.com/angular/angularfire2/issues/725

      【讨论】:

        【解决方案6】:

        使用 AngularFire2:(例如:使用电子邮件和密码组合注册用户。)

        import { AngularFireAuth } from 'angularfire2/auth';
        model : any = {} ;
        private afAuth : AngularFireAuth,
        
        regWithEP () {
            this.afAuth.auth.createUserWithEmailAndPassword(this.model.email, this.model.password).then((user) => {
            /* IMPORTANT !! */
            /* EXPLICIT CHECK IF USER IS RETURNED FROM FIREBASE SERVICE !! */
        
                  if (user) {
                    console.log(user);
                    /* Here user is available and is the same as auth.currentUser */
        
                    this.afAuth.auth.currentUser.getToken().then((token) => {
        
                    //token is available here
                    //set token to currentUser, signIn , re-direct etc.
                    });
                }
            });
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-23
          • 2014-10-04
          • 2011-12-12
          • 2014-09-04
          • 2020-10-29
          • 2014-05-05
          • 1970-01-01
          • 2012-05-16
          相关资源
          最近更新 更多