Firebase 令牌验证

Firebase Token Verification

我有一个 PHP 后端和一个 Android 客户端。使用客户端,用户可以通过 Firebase 使用 Google 或 Facebook 登录我的应用程序。我从 FirebaseUser 获取令牌并将其发送到我的服务器。很简单,第一部分(header)包含算法(RS256),第二部分(payload)包含所有用户相关数据。第三部分是前两个部分的签名,用于在我的后端启用验证。问题是,我不知道该怎么做。更具体地说是什么。

我使用 JWT.io 检查我的令牌并尝试验证它,但没有成功。由于使用的算法是 RS256,因此应通过 public 密钥进行验证。但是public键是什么?我尝试使用我的应用程序的密钥库,尝试使用 Google 的证书,但它一直说它无效。我知道 headerkid 字段是签名密钥的 ID,我应该寻找它,但我不知道在哪里。

Firebase 文档也无济于事。有一个关于 ID token verification 的指南,但这没用,因为它是 Java / Node.JS 并且它仍然没有说明任何关于 public 键的信息。

所以问题是:我从哪里得到 public 密钥?

好的,所以我深入研究了 Firebase Server SDK 的源代码并找到了 public 键的位置: https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com

真的不知道为什么他们不能把它放在他们的网站上...

无论如何,我不确定,但我猜想这些密钥每天都会更改(就像 OAuth2 密钥一样),因此您必须时不时地检查并在您的服务器上重新缓存它们。

此外,您还必须检查以下值:

  • alg == "RS256"
  • iss: https://securetoken.google.com/<firebaseProjectID>
  • aud: <firebaseProjectID>
  • sub 非空

Found these at (just scroll to the bottom of the answer), which was found by searching for that specific googleapis.com URL.