使用类路径中的.p12文件进行GoogleCredential

我正在制作一个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文件使其工作?

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

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

我完全不知道该怎么做。

在您回答之前,请确保您有使用Google OAuth2库的经验。 并且,请不要将资源复制到临时文件中:如果出于某种原因,Credential.p12的单数版本应该保留在JAR中。

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

  • 从Google开发人员控制台生成的p12文件的密码始终是“notasecret”以及别名的密码
  • 私钥的别名始终是“私钥”

使用以下代码从资源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(); 

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

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