如何正确实例化 GoogleIdTokenVerifier / .setAudience() 做什么?

How to instantiate GoogleIdTokenVerifier properly / what does .setAudience() do?

我的指南

如果遵循 this Google 有关在服务器端验证 Google-Account-Tokens 的文档,但我有点困惑。

我的问题

GoogleIdTokenVerifier googleIdTokenVerifier = new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), new JacksonFactory())
                                .setAudience(Collections.singletonList(CLIENT_ID))
                                .build();

在这段代码中,我发现 transportjsonFactory 参数可以填写为 new NetHttpTransport()new JacksonFactory() here。它还描述了如何获得 AudienceString,但我无法弄清楚它的用途。我无法测试它,但我的问题是我是否可以在没有 .setAudience() 的情况下使用它,或者我是否需要它以及它的用途。

.setAudience() 中,您必须通过所有客户 ID 的测试。您可以从 Credentials Page. It's explained here.

为您的客户获取 ID

感谢@StevenSoneff

如果你没有得到基本概念

对于您希望服务器接受的每个客户端,您需要在“Developer Console”中创建一个项目。客户通过他们的“SHA-1”指纹来区分。例如,您可以有一个调试项目(将采用您的调试指纹)和一个发布项目。要使两者都起作用,您必须将这两个 `ID` 添加到服务器的 `GoogleIdTokenVerifier` 的 `.setAudience()` 中。

就我而言,如果您使用 Firebase 在 Android 或 iOS 上获取 ID 令牌。您应该按照这些说明在后端服务器上对其进行验证。

Verify ID tokens using a third-party JWT library

对我来说,我使用 Google OAuth Client 作为第三方库,所以它很容易使用。 但是和这篇文档有点不一样。

Verify the Google ID token on your server side

  1. CLIENT_ID 是您的 firebase 项目 ID。
  2. Issuer必须设置为https://securetoken.google.com/<projectId>
  3. 你需要使用GooglePublicKeysManager调用setPublicCertsEncodedUrl设置为https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
GooglePublicKeysManager manager = new GooglePublicKeysManager.Builder(HTTP_TRANSPORT, JSON_FACTORY)
                .setPublicCertsEncodedUrl(PUBLIC_KEY_URL)
                .build();

GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(manager)
                .setAudience(Collections.singletonList(FIREBASE_PROJECT_ID))
                .setIssuer(ISSUER)
                .build();

如果您有多个颁发者,则必须为每个颁发者创建 GoogleIdTokenVerifier