我有一个部署到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/

10-11 17:40