使用类路径中的 .p12 文件作为 GoogleCredential
Use a .p12 File from classpath for GoogleCredential
我正在制作一个打包在单个 JAR 文件中的 java 命令行应用程序,该文件使用了 Google 的一些 API.
我需要从私钥 "Credentials.p12" 设置一个 Google 凭据对象。
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 中是有原因的。
在深入研究 GoogleCredential.Builder
class 源代码后,我发现了以下内容:
- 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();
或者您可以在实例化凭证时指定密钥文件。
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountPrivateKeyFromP12File(new File(KEY_FILE_LOCATION))
.setServiceAccountScopes(AnalyticsScopes.all())
.build();
我正在制作一个打包在单个 JAR 文件中的 java 命令行应用程序,该文件使用了 Google 的一些 API.
我需要从私钥 "Credentials.p12" 设置一个 Google 凭据对象。
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 中是有原因的。
在深入研究 GoogleCredential.Builder
class 源代码后,我发现了以下内容:
- 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();
或者您可以在实例化凭证时指定密钥文件。
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountPrivateKeyFromP12File(new File(KEY_FILE_LOCATION))
.setServiceAccountScopes(AnalyticsScopes.all())
.build();