我在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文件。
答案 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文档的文章:
没有必要为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));