AngularFire getIdToken(true) 不刷新令牌

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)