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

How do I get the current user's access token in AngularFire2?

本文关键字:用户 访问令牌 AngularFire2      更新时间:2023-09-26

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

似乎没有办法访问这个与AngularFire2?

在初始登录时这样写:

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

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

是否有访问当前用户accessToken的方法?

getToken现在已弃用。您应该使用getIdToken:

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

访问令牌仅在用户首次登录时可访问。来自web开发人员的Firebase迁移指南:

使用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,你可以像这样获得令牌:

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

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

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

这个适合我:

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

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

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

我在访问访问令牌(res.stsTokenManager.accessToken)时遇到困难,因为它总是返回未定义。为了解决这个问题,我实现了以下解决方案:

this.afAuth.currentUser.then((res: any) => {
  console.log(JSON.parse(JSON.stringify(res))?.stsTokenManager.accessToken);
});

我使用了afAuth。currentUser方法,该方法返回一个解析到当前用户对象的承诺。然后,我应用Then函数来处理解析后的值。在then回调中,我使用JSON.stringify(res)将用户对象转换为JSON字符串。之后,我使用JSON.parse将JSON字符串解析回对象。最后,为了安全地访问访问令牌属性,我使用了可选的链接操作符(?.),后面跟着stsTokenManager.accessToken.

通过实现这个代码片段,我能够成功地记录当前用户的stsTokenManager对象的访问令牌的值。这种方法帮助我避免了在访问令牌或任何中间属性未定义的情况下出现的任何潜在错误。

从angularfire2中获取认证令牌

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

从下面的讨论中可以看出:https://github.com/angular/angularfire2/issues/725

使用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.
            });
        }
    });
}