如何在 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 valuechanges 方法获取随机数据