使用GAE服务帐户JSON密钥

时间:2014-07-16 12:49:29

标签: java json google-app-engine service-accounts

我在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私钥,我可以在我的属性文件中配置它。

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

2 个答案:

答案 0 :(得分:2)

由于此问题仍在获得观看且没有接受的答案,因此以下是如何使用JSON密钥与Google API客户端库稍微改编自官方文档部分“Using OAuth 2.0 with the Google API Client Library for 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'上面指的是包含你方法的父类的名字。

答案 1 :(得分:-1)

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

你可以在SO上找到更多关于服务帐户的其他问题: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));