问题描述
我在一个项目中使用 Firebase,在该项目中我使用 Firebase 令牌 ID 作为不记名令牌来对用户进行身份验证。
项目工作正常,但我想知道 verifyIdToken()
在缓存时如何工作。
现在,项目是这样运作的:
问题与 verifyIdToken()
方法有关,以及是否需要在每个新令牌上调用 Firebase API。
我读过 this 问题,其中说:
VerifyIdToken() 也针对性能进行了优化。它缓存 Firebase 令牌公共证书(有效期为 6 小时),用于验证本地机器上的令牌签名。除了下载公共证书外,不涉及任何RPC。
另外,this 回答说:
当您调用 verifyIdToken 时,Admin SDK 会使用公钥对令牌进行解码并验证签名是否有效。它从 Google 的服务器下载此密钥,但它会缓存 24 小时
还有评论:
verifyIdToken() 从 Google 服务器获取公钥。但这些缓存最多可缓存 24 小时,因此 RPC 调用开销会被摊销。
但是,下载并缓存了哪些证书?来自用户还是项目?
那么,服务器是否需要在从客户端获取的每个新 tokenId
上调用 Firebase API,或者服务器是否可以使用缓存的证书在没有互联网连接的情况下解码?
主要目标是减少对 Firebase API 的调用次数,所以我想知道是否每 24 小时下载一次 perm 缓存,服务器可以在没有互联网的情况下解码项目的每个有效令牌。
提前致谢。
解决方法
但是,下载并缓存了哪些证书?来自用户还是项目?
ID 令牌使用私钥签名。 SDK 需要获取对应的公钥证书来验证签名。这来自https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
那么,服务器是否需要在从客户端获取的每个新 tokenId 上调用 Firebase API,或者服务器是否可以使用缓存的证书在没有互联网连接的情况下解码?
服务器在第一次验证令牌时需要能够获取公钥证书。然后,只要缓存的证书保持有效(最多 24 小时),它就可以在没有连接的情况下运行。但这不是你可以控制的,所以你不应该依赖它。
主要目标是减少对 Firebase API 的调用次数,所以我想知道是否每 24 小时下载一次 perm 缓存,服务器可以在没有互联网的情况下解码项目的每个有效令牌。
这取决于您的服务器是如何实现和部署的。公钥缓存与 SDK 创建的 Auth
对象实例相关联。如果您的服务器是持久的,Auth
实例将保留在内存中,缓存也是如此。在这种情况下,您可以预期服务器每 24 小时进行大约 1 次 rpc(使用相同的缓存证书来验证所有令牌)。
但如果您的服务器是临时的(例如 Cloud Functions),那么 Auth
实例将被多次创建和清理。在这样的部署中,缓存不会有太大的不同,服务器最终会为服务器的每次调用生成一个 rpc。