来自数据流的证书(JSON_FILE_AS_INPUTSTREAM)无法正常工作

iyfjxgzm  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(104)

我已使用Google Developer Console为我的服务帐户下载了公共/私人凭据的JSON文件:

{
  "private_key_id": "myPrivateKey",
  "private_key": "-----BEGIN PRIVATE KEY-----\myPrivateKeyString\n-----END PRIVATE KEY-----\n",
  "client_email": "myClientEmail@developer.gserviceaccount.com",
  "client_id": "myClientEmailId.apps.googleusercontent.com",
  "type": "service_account"
}

它们存储在类路径中名为serviceAccountCredentials.json的文件中
当我尝试执行以下代码以返回GoogleCredential示例时:

InputStream credentialsJSON = MyClass.class.getClassLoader().getResourceAsStream("serviceAccountCredentials.json");
    JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    return GoogleCredential.fromStream(credentialsJSON ,httpTransport,JSON_FACTORY);

它将使用以下堆栈跟踪进行扩展:

Exception in thread "main" java.lang.IllegalArgumentException: no JSON input found
    at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:92)
    at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:49)
    at com.google.api.client.json.JsonParser.startParsing(JsonParser.java:222)
    at com.google.api.client.json.JsonParser.parse(JsonParser.java:379)
    at com.google.api.client.json.JsonParser.parse(JsonParser.java:354)
    at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:87)
    at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:81)
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.fromStream(GoogleCredential.java:250)

我可以使用以下代码将文件的内容打印到控制台:
System.out.println(IOUtils.toString(credentialsJSON));

因此,我知道JSON文件可访问并且包含内容。

因此,我们假设这个API从根本上被破坏了。
我倾向于使用JSON的解决方案。我不想使用P12文件,因为:
1.我希望从类路径GoogleCredential.Builderdoes not provide a method which consumes an InputStream(仅File)提供凭据,因此P12不是可接受的选项:

  1. Google在其创建凭据的UI中暗示P12是传统的身份验证方式,并且应该在第一个示例中使用JSON:

voj3qocg

voj3qocg1#

@pongrad已经调查了这个问题,并生成了代码,说明API在隔离状态下可以正常工作。
我放弃这个问题,因为它太孤立了(怀疑在我的其他项目依赖关系的上下文中存在Maven transient 依赖关系问题)。

hec6srdp

hec6srdp2#

对于每一个更改,重新启动IDE。这是我犯的错误,在尝试不同的解决方案后没有重新启动IDE。我的filename.json文件在resource文件夹中。

GoogleCredentials googleCredentials = GoogleCredentials
.fromStream(new ClassPathResource("your file.json")
.getInputStream());

相关问题