9

我在 GAE 中有一个应用程序,我正在使用服务帐户来调用一些谷歌服务。当我在仪表板中创建服务帐户时,向我提供了一个 JSON 密钥。json的内容是这样的:

{
  "private_key_id": "bar-foo",
  "private_key": "-----BEGIN PRIVATE KEY-----foo-bar\n-----END PRIVATE KEY-----\n",
  "client_email": "foo-bar@developer.gserviceaccount.com",
  "client_id": "bar-foo.apps.googleusercontent.com",
  "type": "service_account"
}

如何在我的 java 代码中使用这个 private_key 来生成一个 GoogleCredential 对象?

我可以使用该方法做到这一点,setServiceAccountPrivateKeyFromP12File但为此我需要创建一个 p12 文件并将其存储在某处。使用 json 私钥,我可以在我的属性文件中配置它。

我在 中找到了一个接收 PrivateKey 对象作为参数的setServiceAccountPrivate方法,GoogleCredential.Builder但我不知道如何从 json 中的值生成该对象。我发现的所有示例都使用 p12 文件。

4

2 回答 2

4

由于这个问题仍在获得意见并且没有公认的答案,这里有一个示例,说明如何将 JSON 密钥与 Google API 客户端库一起使用,稍微改编自官方文档部分“将 OAuth 2.0 与 Google API 客户端库一起使用”对于Java ':

HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
...
// Build service account credential.

GoogleCredential credential = GoogleCredential.fromStream(MyClass.class.getResourceAsStream("/MyProject-1234.json"))
    .createScoped(Collections.singleton(PlusScopes.PLUS_ME));
  // Set up global Plus instance.
  plus = new Plus.Builder(httpTransport, jsonFactory, credential)
      .setApplicationName(APPLICATION_NAME).build();

您将放置您的密钥文件,例如。'MyProject-1234.json' 到 /src/main/resources 和上面的 'MyClass' 是指包含您的方法的父类的名称。

于 2016-03-11T18:05:47.133 回答
-1

您应该在创建项目时使用 GAE 代表您创建的内置服务帐户。您可以在此处查看如何使用它的示例:https ://developers.google.com/bigquery/authorization#service-accounts-appengine

您可以从这里的其他问题中找到有关服务帐户的更多信息:https ://stackoverflow.com/a/24478017/700188 (它适用于 python,但应该有相应的 java 文章)

编辑

这是一篇关于使用内置服务帐户身份与 Google 的 API 通信的 Google AppEngine 文档:

https://developers.google.com/appengine/docs/java/appidentity/#Java_Asserting_identity_to_Google_APIs

无需为 GAE 使用单独的服务帐户,因为已经为您提供了一个。

编辑 2

不确定 JSON 文件中的私钥是否与 p12 文件中的私钥相同,但如果是,您可以尝试类似(抱歉,我的 Java 可能有点生锈):

import com.google.api.client.util.SecurityUtils;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.PrivateKey;
// Read the JSON Private key as a byte[] array into bytes
PrivateKey serviceAccountPrivateKey = SecurityUtils.getRsaKeyFactory().generatePrivate(new PKCS8EncodedKeySpec(bytes));
于 2014-07-16T13:06:59.440 回答