使用嵌入在GoogleCredential Builder的jar文件中的私钥(p12)

时间:2016-10-26 10:39:35

标签: java google-sheets-api

我使用Google表格API查询Google上的电子表格。从Eclipse中运行时代码运行正常。但是,当项目打包到jar(例如,spreadsheets-api.jar)并从另一个项目中用作maven依赖项时,我遇到了以下方法调用的问题:

public static Sheets createService() throws GoogleServiceInitException {
        if (properties == null)
            init();
        URL keyfile = GoogleSpreadSheetService.class.getResource(getValue(PropertyEnum.PRIVATEKEY_FILE));
        if (keyfile == null)
            throw new GoogleServiceInitException("Missing private key file");
        Credential credential;
        try {
            credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT).setJsonFactory(JSON_FACTORY)
                    .setServiceAccountId(getValue(PropertyEnum.SERVICE_ACCOUNT_ID))
                    .setServiceAccountPrivateKeyFromP12File(Paths.get(keyfile.toURI()).toFile())
                    .setServiceAccountScopes(SCOPES).build();
            return new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME)
                    .build();

        } catch (GeneralSecurityException | IOException | URISyntaxException e) {
            logger.error(APGeneralUtilities.stacktraceToString(e));
            throw new GoogleServiceInitException(e.getMessage());
        }
    }

问题在于方法setServiceAccountPrivateKeyFromP12File,它只需要java.io.File作为参数。因此,当我尝试通过将jar中的嵌入式P12文件作为URL引用来访问此文件,然后使用此代码行Paths.get(keyfile.toURI()).toFile()将其转换为文件时,代码会弹出java.nio.file.FileSystemNotFoundException

问题非常清楚。我需要将P12文件称为流,我可以通过使用Class.getResourceAsStream()或其他替代方法来实现,但Google的凭据构建器仅将文件作为参数。

我现在有什么选择?我看到它的方式,使用sheet api,我只需要获取流,将其复制到临时文件,然后将该文件的路径作为参数提供给Credentials构建器,最后删除临时文件一切都完成了。有没有更简单的方法来解决这个问题?

0 个答案:

没有答案