FixedCredentialsProvider 在调用 Google 云服务时给出未经授权的异常

FixedCredentialsProvider gives unauthorized exception when calling Google Cloud service

我正在尝试通过 google 服务帐户调用 Google Cloud DocumentAI。我有为它生成的 json 密钥,我通过 FixedCredentialsProvider 和一个 GoogleCredentials 对象将它加载到我的应用程序中,因为我的用例无法通过环境变量加载它.此方法曾经有效,但现在它会抛出 UNAUTHORIZED 异常以及与没有有效 OAuth2 令牌相关的问题。当我使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量测试场景时,它工作正常。是否有更改不再允许 FixedCredentials 方法?我没有更新 sdk,它自己停止了。是否有一种新的方式来以编程方式加载凭据 JSON 密钥?

最终检查了 SDK 源代码以找到答案。通过环境变量加载和使用 GoogleCredentials 之间的区别在于,在后一种情况下,它 而不是 提供 OAuth2 scopes,这是自上次测试以来对于 DocumentAI 服务,Google 方面成为强制性要求。使用环境变量加载密钥来自提供一些 default 范围的不同代码路径。我们可以在通过 GoogleCredentials 加载时手动提供相同的范围,如下所示:

GoogleCredentials googleCredentials = GoogleCredentials
    .fromStream(new FileInputStream(jsonKeyFile))
    .createScoped(DocumentUnderstandingServiceSettings.getDefaultServiceScopes());
DocumentUnderstandingServiceClient client = DocumentUnderstandingServiceClient.create(
      DocumentUnderstandingServiceSettings.newBuilder()
      .setCredentialsProvider(FixedCredentialsProvider.create(googleCredentials))
      .build()
);

DocumentUnderstandingServiceSettings.getDefaultServiceScopes() returns 一个静态变量,它包含与环境变量加载方法所使用的范围相同的范围,这反过来又使 DocumentAI 可以与手动创建的 GoogleCredentials 一起使用。