错误:Firebase ID 令牌已过期

问题描述 投票:0回答:9

在我的服务器上,我在使用 firebase admin sdk 时看到这些错误

.verifyIdToken()

Firebase ID 令牌已过期。从您的客户端应用程序获取新令牌并重试

Firebase ID 令牌具有“kid”声明,该声明与已知的公钥不对应。 ID 令牌很可能已过期,因此请从客户端应用程序获取新令牌,然后重试。有关如何检索 ID 令牌的详细信息,请参阅 https://firebase.google.com/docs/auth/admin/verify-id-tokens

在客户端,我在浏览器 <> 服务器之间的每个请求之前执行此操作:

firebase.auth().currentUser.getIdToken()

通过阅读文档,我了解到该函数将获得一个有效的、未过期的令牌,因为后台的 SDK 会根据需要自行刷新。或者,我可以将

true
传递给此函数以强制刷新。

为什么这个

getIdToken()
函数似乎正在向我的后端发送过期的令牌?

似乎要解决这个问题,我的选择是:

  1. 每次调用 getIdToken() 时传入
    true
    强制刷新。这是不必要的昂贵,因为它会在来自浏览器 <> 我的服务器的请求之前增加来自浏览器 <> firebase 的整个往返网络请求的开销
  2. 按照我现在的方式调用
    getIdToken()
    - 在客户端手动解码令牌,检查过期时间,如果过期,则再次调用
    getIdToken(true)
    强制刷新并将新刷新的令牌发送到我的服务器

第 2 种方法是推荐/预期的处理方法吗?这里好像出了什么问题...

firebase firebase-authentication
9个回答
37
投票

令牌通常会在一小时后过期。如果缓存的令牌过期,

getIdToken
将刷新它。确保当您需要将令牌发送到服务器时始终在客户端上调用它。如果您缓存令牌并始终将其发送到后端,那么它会在某个时候过期。

为了以防万一,请确保您的服务器时钟同步。这不太可能,但您的时钟可能由于某种原因不同步。


11
投票

上述提到的另一个可能的解决方案是您的浏览器(或系统)日期错误。它几乎总是与日期相关吗?


10
投票
Error: Firebase ID token has expired

当您的设备时间错误时,您会收到此错误。还要检查您的设备时钟时间。


4
投票

如果您在后端使用令牌,那么您可以执行以下操作,

1.后台查看token

2.如果token已过期,发送401未授权。

3.在客户端检查状态码是否为401未授权,如果是则调用

getIdToken
并保存新的token


4
投票

我在尝试和错误前后遇到了同样的问题,我发现这是由时间同步引起的。

我将计算机时间和时区设置为自动并解决了问题。 另外,记得在 getIdToken(true) 中添加“true”


0
投票

尝试使用类似这样的东西:

Auth.auth().currentUser.getIDTokenForcingRefresh(true) { (token, err) in

/* your code to manage error and success */

}

0
投票

您是否注意到有一种异步方式获取令牌?

            mAuth.getCurrentUser().getIdToken(false).addOnSuccessListener(new OnSuccessListener<GetTokenResult>() {
            @Override
            public void onSuccess(GetTokenResult getTokenResult) {
                long time = System.currentTimeMillis() - starttime;

                Log.d("testt", "time " + time + ", token " + getTokenResult.getToken());
            }
        });

不确定,但我猜它会进行内部检查,以及令牌是否不再有效(例如,当前用户有一个刷新的令牌广播,但由于某种原因(例如网络问题)没有到达用户) ,它请求新的并返回它。

附注我也在对这个主题进行研究,如果发现任何新的东西,我会更新。


0
投票

const 用户 = firebase.auth().currentUser

const { token } = 等待 user.getIdTokenResult(true)

试试这个。使用此方法不会使令牌过期


0
投票

但是在托管任何应用程序后,假设我托管了来自印度的应用程序,并且美国的任何用户正在使用,并且在系统或桌面中时区不同步,那么 firebase id 令牌将抛出错误。如果它抛出错误,那么解决方案是什么。

© www.soinside.com 2019 - 2024. All rights reserved.