在我的服务器上,我在使用 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 种方法是推荐/预期的处理方法吗?这里好像出了什么问题...
令牌通常会在一小时后过期。如果缓存的令牌过期,
getIdToken
将刷新它。确保当您需要将令牌发送到服务器时始终在客户端上调用它。如果您缓存令牌并始终将其发送到后端,那么它会在某个时候过期。
为了以防万一,请确保您的服务器时钟同步。这不太可能,但您的时钟可能由于某种原因不同步。
上述提到的另一个可能的解决方案是您的浏览器(或系统)日期错误。它几乎总是与日期相关吗?
Error: Firebase ID token has expired
当您的设备时间错误时,您会收到此错误。还要检查您的设备时钟时间。
如果您在后端使用令牌,那么您可以执行以下操作,
1.后台查看token
2.如果token已过期,发送401未授权。
3.在客户端检查状态码是否为401未授权,如果是则调用
getIdToken
并保存新的token
我在尝试和错误前后遇到了同样的问题,我发现这是由时间同步引起的。
我将计算机时间和时区设置为自动并解决了问题。 另外,记得在 getIdToken(true) 中添加“true”
尝试使用类似这样的东西:
Auth.auth().currentUser.getIDTokenForcingRefresh(true) { (token, err) in
/* your code to manage error and success */
}
您是否注意到有一种异步方式获取令牌?
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());
}
});
不确定,但我猜它会进行内部检查,以及令牌是否不再有效(例如,当前用户有一个刷新的令牌广播,但由于某种原因(例如网络问题)没有到达用户) ,它请求新的并返回它。
附注我也在对这个主题进行研究,如果发现任何新的东西,我会更新。
const 用户 = firebase.auth().currentUser
const { token } = 等待 user.getIdTokenResult(true)
试试这个。使用此方法不会使令牌过期
但是在托管任何应用程序后,假设我托管了来自印度的应用程序,并且美国的任何用户正在使用,并且在系统或桌面中时区不同步,那么 firebase id 令牌将抛出错误。如果它抛出错误,那么解决方案是什么。