当前位置: 首页 > 面试题库 >

使用来自classpath的.p12文件获取GoogleCredential

蒋曾笑
2023-03-14
问题内容

我正在将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"与别名的密码相同
  • 私钥的别名始终为 "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();


 类似资料:
  • 问题内容: 顾名思义,我需要Google服务帐户api访问所需的.p12文件。为了获得连接到api的凭据,有一个字段.setServiceAccountPrivateKey(PrivateKey privateKey)。那么,最简​​单的方法是什么?我在类路径中有一个资源文件夹,因此,如果在其中添加p12文件,则可以从getClass()。getResource()中获取资源作为inputStre

  • 正如标题所示,我有谷歌服务帐户api访问所需的。p12文件。为了获得连接到api的凭据,有一个字段。SetServiceAccountPrivateKey(PrivateKey PrivateKey)。那么,最简单的方法是什么呢?我在类路径中有一个resources文件夹,所以如果我在那里添加p12文件,我可以从getClass().getResource()中以inputStream或URL的形

  • 然后,为了生成CA要求的,我执行了以下操作: CA使用我存储在名为的文件中的证书进行响应 现在我想将必要的组件(私钥、公钥(?)和证书)捆绑到单个中。为此,我运行了以下操作: 但我收到以下错误消息: 我怎样才能完成这件事呢?

  • 问题内容: 我正在尝试浏览特定用户的推文,并获得对该推文的所有回复。我发现twitter的APIv1.1不直接支持它。 是否有破解或变通方法来获取特定推文的回复。我正在使用python Streaming API。 问题答案: 有使用REST API的解决方法。 您将需要要查找回复的原始推文作者的id_str和@username。 您应该将Search API用于作者的“ @用户名”。浏览结果以查

  • 问题内容: 上传之前,有没有一种方法可以使用angularJS在输入字段中获取所选文件的名称,路径和大小? 任何人都可以帮助解决这个问题吗? 问题答案: HTML5 File API将为您尝试上传的每个文件提供一个对象。该对象将具有and 属性,该属性将为您提供文件大小(以字节为单位)和文件名。 但是,用户计算机上文件的物理路径没有属性。 您可以在MDN上阅读有关此内容的更多信息:https :