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

Posted

技术标签:

【中文标题】如何正确实例化 GoogleIdTokenVerifier / .setAudience() 做啥?【英文标题】:How to instantiate GoogleIdTokenVerifier properly / what does .setAudience() do?如何正确实例化 GoogleIdTokenVerifier / .setAudience() 做什么? 【发布时间】:2017-06-01 23:48:17 【问题描述】:

我的指导方针

如果遵循thisGoogle 关于在服务器端验证 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() 的情况下使用它,或者我是否需要它以及它的用途。

【问题讨论】:

这必须与您在 GoogleSignInOptions.Builder 中提供给 .requestIdToken() 的 CLIENT_ID 匹配(参见文档示例:developers.google.com/identity/sign-in/android/backend-auth),它必须与您的项目配置匹配。这里有一个完整的解释:android-developers.googleblog.com/2016/03/… @StevenSoneff 是的,谢谢伙计。现在一切正常:) 【参考方案1】:

.setAudience() 中,您必须传递所有客户端ID。您可以从Credentials Page 为您的客户获取ID。解释了here。

感谢 @StevenSoneff

如果你没有掌握基本概念

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

【讨论】:

【参考方案2】:

就我而言,如果您使用 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

    CLIENT_ID 是您的 Firebase 项目 ID。 Issuer 必须设置为https://securetoken.google.com/<projectId>。 需要使用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

【讨论】:

以上是关于如何正确实例化 GoogleIdTokenVerifier / .setAudience() 做啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确实例化 os.FileMode

如何正确模拟实例化类变量的函数?

如何在 laravel 之外正确实例化 Iluminate 类

如何使用 dotnet spark 正确实例化 spark 会话?

MultiBlocProvider 未实例化所有 bloc 提供程序 - 如何正确使用 MultiBlocProvider?

如何从 OS X 上的框架实例化 NSViewController(即获取正确的包)