如何在 AngularFire2 中获取当前用户的访问令牌?

Posted

技术标签:

【中文标题】如何在 AngularFire2 中获取当前用户的访问令牌?【英文标题】:How do I get the current user's access token in 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?

【问题讨论】:

【参考方案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.
            );
        
    );

【讨论】:

以上是关于如何在 AngularFire2 中获取当前用户的访问令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angularfire2 Angular2 中对 FirebaseListObservable 列表进行排序?

AngularFire2:实时数据库:如何获取键和值

如何使用 angularfire2 valuechanges 方法获取随机数据

AngularFire2:通过多个浏览器选项卡通知注销

使用 angularfire2 在 firebase 数据库中获取时间

使用 Angular2、angularfire2 和 Typescript 从 Firebase 对象中获取数据