Ale*_*ing 6 javascript angularfire firebase-authentication angular
我有一个 AngularFire 身份验证服务,它工作得非常好 - 除了它不会刷新令牌。
我的刷新代码:
firebase.auth().currentUser.getIdToken(true).then((token: string) => {
const newUser = { token: token }; // new user details in brief
this.user.next(newUser);
});
Run Code Online (Sandbox Code Playgroud)
调用 firebase 服务很好并给出响应,但它只返回当前令牌并且不会刷新令牌 - 因此它仍然在 1 小时后退出应用程序。
我已经阅读了大量有关 getIdToken 的问题,但没有一个专门解决不刷新的令牌。
我做了一个 stackblitz:https://stackblitz.com/edit/angular-ivy-uvcdz7 ?file=src/app/app.component.ts 这样你就可以看到完整的代码(尽管由于某种原因它不起作用,但也是因为我无法弄清楚如何通过 SB 将项目连接到 firebase)
编辑
为了帮助还有一些我不期望的其他奇怪行为,例如在我的 ngOnInit 中我有......
this.fAuth.onAuthStateChanged((state) => {
console.log(state);
})
Run Code Online (Sandbox Code Playgroud)
当我登录或退出时,它不执行任何操作 - 没有消息表明状态已更改。当身份验证发生变化时,我期望触发的这些功能似乎都没有做任何事情。
编辑2
作为补充信息,在添加赏金之前,我对 Angular 和 AngularFire 进行了全面而痛苦的更新,所以现在 Angular 是 v13,AngularFire 是 7.2.0,看看这是否会产生任何影响,但它没有,getIdToken 仍然提供没有刷新令牌。
编辑3
所以这个函数作为答案提供如下:
public getToken$(): Observable<firebase.auth.IdTokenResult> {
return from(this.fAuth.currentUser).pipe(switchMap(user => {
return from(user.getIdTokenResult(true)).pipe(map(token => {
console.log(token);
return token;
}));
}));
}
Run Code Online (Sandbox Code Playgroud)
它返回一个用户对象:
{“声明”:{“名称”:“Bogomip”,“图片”:“piccie”,“admin”:true,“iss”:“https://securetoken.google.com/repo”,“aud”: “repo”,“auth_time”:1638464159,“user_id”:“用户ID”,“sub”:“用户ID”,“iat”:1638464323,“exp”:1638467923,“电子邮件”:“email@gmail.com ", "email_verified": true, "firebase": { "identities": { "email": [ "email@gmail.com" ] }, "sign_in_provider": "密码" } }, "token": "这是THE TOKEN", "authTime": "2021 年 12 月 2 日星期四 16:55:59 GMT", "issuedAtTime": "2021 年 12 月 2 日星期四 16:58:43 GMT", "expirationTime": "2021 年 12 月 2 日星期四17:58:43 GMT", "signInProvider": "密码", "signInSecondFactor": null }
这是在该函数中记录的“令牌”,但是此(token.token)中的令牌是刷新 ID 还是实际令牌?因为它不会改变,但如果它是刷新令牌,那就有意义了……我们能看到实际的令牌吗?
小智 1
您可以通过以下方式使用 Observables 强制刷新令牌:
public getToken$(): Observable<firebase.auth.IdTokenResult> {
return from(this.angularFireAuth.currentUser).pipe(switchMap(user => {
return from(user.getIdTokenResult(true)).pipe(map(token => {
return token;
}));
}));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1615 次 |
| 最近记录: |