我有一个部署到Tomacat Servlet容器中的应用程序。我有一个后台作业正在运行,在该作业中,我会调用使用服务帐户的PK12文件授权的Google Analytics(分析)。
我无权访问容器的文件系统,因此我将pk12文件部署在WAR的WEB-INF /中。我预计不会获得将任何身份验证密钥添加到Servlet容器的主机的系统注册表/密钥链中的权限。
GoogleCredential的Buidler.setServiceAccountPrivateKeyFromP12File(File)仅使用java.io.File,所以我最终做了一些繁琐的授权工作。我使用serveltContenxt.getResourceAsStream打开PK12文件,并将其内容复制到一个临时文件中,然后将该文件传递给Credential的生成器。
当我尝试去做
java.io.File p12File = new java.io.File(servletContext.getResource('...pk12.file...').getFile())
出现错误消息,表明文件不存在,因为它试图打开磁盘上的文件,而pk12文件未解开或返回的URI不是该文件的正确文件。
什么是正确的方法?我是PrivateKey身份验证和Google客户端API的新手。
这是我当前正在工作的代码:
// create file because credential only takes a File object
final File p12File = File.createTempFile("xxx", ".tmp");
p12File.deleteOnExit();
InputStream in = servletContext.getResourceAsStream("...pk12.file...");
FileOutputStream out = new FileOutputStream(p12File);
org.apache.commons.io.IOUtils.copy(in, out);
out.flush();
out.close();
in.close();
GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("[email protected]")
.setServiceAccountScopes(Collections.singleton(AnalyticsScopes.ANALYTICS_READONLY))
.setServiceAccountPrivateKeyFromP12File(p12File)
.build();
p12File.delete();
// Set up and return Google Analytics API client.
this.analytics = new Analytics.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName("mybackgroundprocess/1.0").build();
谢谢
最佳答案
我发现在这里回答了相同的问题:
Getting a PrivateKey object from a .p12 file in Java
我只需要从资源创建一个私钥
InputStream in = servletContext.getResourceAsStream("p12.file");
PrivateKey privateKey = SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(), in, "notasecret", "privatekey", "notasecret");
然后打电话
GoogleCredential.Builder.setServiceAccountPrivateKey(PrivateKey privateKey)
关于tomcat - 在Servlet容器中为Google Client API加载pk12 java.io.File,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26045500/