对于GoogleCredential,请使用类路径中的.p12文件

时间:2015-09-03 01:19:24

标签: java private-key google-oauth2

我正在将一个java命令行应用程序打包在一个使用Google的API的JAR文件中。

我需要使用私钥“Credentials.p12”设置GoogleCredential对象。

GoogleCredential credential = new GoogleCredential.Builder()
                    .setTransport(httpTransport)
                    .setJsonFactory(jsonFactory)
                    .setServiceAccountId("xxxxx@developer.gserviceaccount.com")
                    .setServiceAccountScopes(Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_GROUP, DirectoryScopes.ADMIN_DIRECTORY_USER, DirectoryScopes.ADMIN_DIRECTORY_ORGUNIT))
                    .setServiceAccountUser(emailAccount)
                    //THE CODE BELOW IS IMPORTANT: I need to change this
                    .setServiceAccountPrivateKeyFromP12File(new File("Credentials.p12"))
                    .build();

        directory = new Directory.Builder(httpTransport, jsonFactory, credential)
                .setApplicationName("My Cmd App")
                .build();

现在我能够使它工作,但文件“Credentials.p12”位于打包的JAR文件之外。

如何使用JAR内部的p12文件使其工作?

从这个documentation开始,我认为我可以使用的唯一其他选择是使用PrivateKey对象的方法变体。我正在考虑使用InputStream从类路径中获取p12文件:

InputStream is = this.getClass().getResourceAsStream("Credentials.p12");

我绝对不知道该怎么做。

在您回答之前,请确保您有使用Google OAuth2库的经验。并且,请不要将资源复制到临时文件中:单独版本的Credential.p12应该保留在JAR内部。

2 个答案:

答案 0 :(得分:5)

在深入了解GoogleCredential.Builder类源代码后,我意识到以下几点:

  • 从Google开发者处生成的p12文件的密码 控制台始终是"notasecret"以及别名的密码
  • 私钥的别名始终为"privatekey"

使用以下代码从资源InputStream构建私钥:

KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(this.getClass().getClassLoader().getResourceAsStream("Credentials.p12"), "notasecret".toCharArray());
PrivateKey pk = (PrivateKey)keystore.getKey("privatekey", "notasecret".toCharArray());

我能够将私钥加载到GoogleCredential Builder中:

GoogleCredential credential = new GoogleCredential.Builder()
                    .setTransport(httpTransport)
                    .setJsonFactory(jsonFactory)
                    .setServiceAccountId("xxxxxx@developer.gserviceaccount.com")
                    .setServiceAccountScopes(Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_GROUP, DirectoryScopes.ADMIN_DIRECTORY_USER, DirectoryScopes.ADMIN_DIRECTORY_ORGUNIT))
                    .setServiceAccountUser(emailAccount)
                    .setServiceAccountPrivateKey(pk) //<----THIS
                    .build();

答案 1 :(得分:0)

或者您可以在实例化凭证时指定密钥文件。

GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
            .setServiceAccountPrivateKeyFromP12File(new File(KEY_FILE_LOCATION))
            .setServiceAccountScopes(AnalyticsScopes.all())
            .build();