在我的服务器上,我在使用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()
函数似乎将过期的令牌发送到我的后端?
似乎要解决这个问题,我的选择是:
true
强制刷新。这是不必要的昂贵,因为它将增加来自浏览器的整个往返网络请求的开销<>来自浏览器的请求之前的firebase<>我的服务器getIdToken()
- 在客户端手动解码令牌,检查过期,如果过期,再次调用getIdToken(true)
强制刷新并发送新刷新的令牌到我的服务器2号是推荐/预期的方式来处理这个问题吗?看来这里有些不对劲......
答案 0 :(得分:6)
上述提到的另一种可能的解决方案是您的浏览器(或系统)日期错误。几乎总是和日期有关吗?
答案 1 :(得分:5)
令牌通常在一小时后到期。如果缓存的令牌已过期,getIdToken
将刷新缓存的令牌。当您需要将令牌发送到服务器时,请确保始终在客户端上调用它。如果您缓存令牌并始终将其发送到您的后端,它将在某个时候到期。
另外,以防万一,确保您的服务器时钟同步。由于某种原因,你的时钟可能不同步。
答案 2 :(得分:1)
comp_rev_long['check'] = comp_rev_long['key'].str.contains('|'.join(comp_rev_long['id']),case=False)
当设备时间错误时,您将收到此错误。还要检查您的设备时钟时间。
答案 3 :(得分:0)
尝试使用类似以下的内容:
Auth.auth().currentUser.getIDTokenForcingRefresh(true) { (token, err) in
/* your code to manage error and success */
}
答案 4 :(得分: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());
}
});
不确定,但是我想它会进行内部检查,并且令牌是否不再有效(例如,当前用户广播了刷新的令牌,并且由于某种原因未到达用户,网络问题例如),它请求新的并返回。
P.S。我也正在对此主题进行研究,如果会发现新内容,将会进行更新。
答案 5 :(得分:0)
如果您在后端使用令牌,则可以执行以下操作
1。检查后端令牌
2。如果令牌已过期,请发送401未经授权的邮件。
3。在客户端上,检查状态代码是否未经授权使用401,如果是,请致电group
并保存新令牌
答案 6 :(得分:0)
在尝试一些错误前后,我都遇到了同样的问题,我发现这是由时间同步引起的。
我将计算机的时间和时区设置为自动,并解决了该问题。 另外,请记住在getIdToken(true)中添加“ true”