错误:Firebase ID令牌已过期

toe95027  于 2023-08-07  发布在  其他
关注(0)|答案(8)|浏览(124)

在我的服务器上,我看到这些错误时,使用firebase管理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.传入true以在每次调用getIdToken()时强制刷新。这是不必要的昂贵,因为它会在来自浏览器<>我的服务器的请求之前,增加来自浏览器<> Firebase的整个往返网络请求的开销
1.以我现在的方式调用getIdToken()-在客户端手动解码令牌,检查过期时间,如果已过期,则再次调用getIdToken(true)以强制刷新并将新刷新的令牌发送到我的服务器
第2条是解决这个问题的建议/预期方法吗?这里好像有点不对劲……

9rygscc1

9rygscc11#

令牌通常在一小时后到期。getIdToken将在缓存令牌过期时刷新该令牌。确保在需要将令牌发送到服务器时始终在客户机上调用它。如果您缓存令牌并始终将其发送到后端,则它将在某个时候过期。
另外,为了以防万一,请确保您的服务器时钟同步。这是不太可能的,但你的时钟可能是出于某种原因不同步。

vyswwuz2

vyswwuz22#

另一个可能的解决方案上面提到的,是你的浏览器(或系统)日期是错误的。它几乎总是与日期有关。

eagi6jfj

eagi6jfj3#

Error: Firebase ID token has expired

字符串
当您的设备时间错误时,您将收到此错误。检查您的设备时钟时间。

e4yzc0pl

e4yzc0pl4#

如果您在后端使用token,则可以执行以下操作:
1.检查后端的令牌
2.如果令牌已过期,发送401未授权。
3.在客户端,检查状态码是否为401未自动化,如果是,调用getIdToken并保存新令牌

cygmwpex

cygmwpex5#

我面临着同样的问题之前和之后的一些尝试和错误,我发现这是由时间同步造成的。
我把我的电脑时间和时区设置为自动,并修复了这个问题。另外,记得在getIdToken(true)中添加“true”

ivqmmu1c

ivqmmu1c6#

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

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

/* your code to manage error and success */

}

字符串

t5fffqht

t5fffqht7#

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

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());
            }
        });

字符串
不确定,但我猜它会进行内部检查,如果token不再有效(例如,有一个刷新的token广播为当前用户,它没有到达用户出于某种原因,例如网络问题),它会请求新的token并返回。
我正在做一个关于这个主题的研究,以及,将更新,如果会发现任何新的。

dluptydi

dluptydi8#

const user = firebase.auth().currentUser
const { token } = await user.getIdTokenResult(true)
试试这个。使用这个方法不会使令牌过期

相关问题