如何使用服务帐户 JSON 创建 GoogleCredential

Posted

技术标签:

【中文标题】如何使用服务帐户 JSON 创建 GoogleCredential【英文标题】:HOWTO create GoogleCredential by using Service Account JSON 【发布时间】:2015-11-08 06:09:10 【问题描述】:

我正在为android Publisher v2Oauth2 v2 使用Java SDK。一旦我创建了服务帐户,我就获得了一个带有客户端 ID、电子邮件、私钥等的 Google Play Android Developer 服务帐户的 JSON。我试图环顾四周并弄清楚如何创建一个凭据,以便我使用 AndoirdPublisher 服务来获取有关我的 Android 应用用户订阅、权利等的信息,并将此信息存储在我们的后端服务器上。

我很难弄清楚如何去做。到目前为止,我看到的所有文档都没有帮助使用下载的 JSON 创建GoogleCredential

例如有这个documentation,但它只提到了 P12 文件而不是 JSON。如果可能,我想避免 P12,因为我有多个客户端,并且我想将此 JSON 保存在某种数据库中,然后使用它为每个客户端创建凭据。

只是为了澄清我正在尝试按照此处所述创建 GoogleCredential 对象,

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.sqladmin.SQLAdminScopes;

// ...

String emailAddress = "123456789000-abc123def456@developer.gserviceaccount.com";
JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
GoogleCredential credential = new GoogleCredential.Builder()
    .setTransport(httpTransport)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId(emailAddress)
    .setServiceAccountPrivateKeyFromP12File(new File("MyProject.p12"))
    .setServiceAccountScopes(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
    .build();

但我不想像setServiceAccountPrivateKeyFromP12File() 那样使用 P12 文件设置服务帐户,而是想使用在创建服务帐户时生成的带有相同信息的 JSON。

【问题讨论】:

不完全确定您在问什么,但您应该首先按照here 列出的步骤进行操作。如果您愿意使用它,它将告诉您如何创建服务帐户。为确保您确实可以提取信息,需要检查的是,启用 Google Play Android Developer API,将您的项目与您的 Google Play 发布帐户相关联,并在 Google Play 商店控制台中为您的服务帐户授予必要的权限。跨度> @Andy 谢谢。是的,我已经创建了一个服务帐户并希望使用为其生成的 JSON(而不是 P12 文件)来创建 GoogleCredential 对象。 @Andy 我已更新问题以提供更多信息。 【参考方案1】:

我能够通过在 github 上深入研究 GoogleCredential 的源代码(目前位于 here)来解决这个问题。

原来我的代码中存在的google-api-java-client 版本有点过时了。我将它升级到最新的1.20.0 & 我现在可以直接指定为创建 GoogleCredential 而创建的 JSON 对象。我希望 Google 能够更新他们的文档。

这里是代码sn-p,

InputStream resourceAsStream = AuthTest.class.getClassLoader().getResourceAsStream("Google-Play-Android-Developer.json");

GoogleCredential credential = GoogleCredential.fromStream(resourceAsStream);

就这么简单。

【讨论】:

某些 Google Api 需要一些范围,您可以使用以下方法添加范围: credential = credential.createScoped(PredictionScopes.all()); 将 JSON 密钥放入 apk 有哪些安全风险?似乎是个坏主意....但我没有更好的解决方案。 @Chantz 你把Google-Play-Android-Developer.json 文件放在哪里了?我把它放在app 文件夹中,但它给了我空值。 @Innova 我为一个网络应用程序做了这个。所以我的用例是不同的表单应用程序。 我尝试了 credential = credential.createScoped(PredictionScopes.all())。但是当我试图在我的 GSuite 域中模拟某人时,它确实有效。

以上是关于如何使用服务帐户 JSON 创建 GoogleCredential的主要内容,如果未能解决你的问题,请参考以下文章

如何使用服务帐户密钥通过 ADF 连接到 Google 云存储

将Google People API与服务帐户配合使用

使用 Postman 的服务帐户对 Google Cloud Storage JSON API 进行身份验证

使用 terraform 如何创建一个跨多个项目使用的服务帐户?

使用 GAE 服务帐户 JSON 密钥

如何使用服务帐户和 bigquery 包进行身份验证?