如何使用服务帐户 JSON 创建 GoogleCredential
Posted
技术标签:
【中文标题】如何使用服务帐户 JSON 创建 GoogleCredential【英文标题】:HOWTO create GoogleCredential by using Service Account JSON 【发布时间】:2015-11-08 06:09:10 【问题描述】:我正在为android Publisher v2
和Oauth2 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 云存储
使用 Postman 的服务帐户对 Google Cloud Storage JSON API 进行身份验证