【问题标题】:GCP IAP Java example returning ComputeEngineCredentials instead of ServiceAccountCredentialsGCP IAP Java 示例返回 ComputeEngineCredentials 而不是 ServiceAccountCredentials
【发布时间】:2019-03-06 18:37:14
【问题描述】:

上下文

我在 Google AppEngine 柔性环境中有一些服务通过 API 进行通信,同时我使用 IAP 来管理用户访问。我必须使用 Bearer JWT 令牌以编程方式对每个服务进行身份验证。

问题

在我的 Java 应用程序中,我使用 google 提供的代码来验证 IAP 服务,您可以在此处找到:https://cloud.google.com/iap/docs/authentication-howto#iap_make_request-java

问题出在这段代码中:

GoogleCredentials credentials =
    GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(IAM_SCOPE));
// service account credentials are required to sign the jwt token
if (credentials == null || !(credentials instanceof ServiceAccountCredentials)) {
  throw new Exception("Google credentials : service accounts credentials expected");
}
return (ServiceAccountCredentials) credentials;

createScoped 方法返回一个 ComputeEngineCredentials,而代码期待一个 ServiceAccountCredentials 响应对象。

欢迎所有建议。提前感谢有史以来最伟大的社区。​​p>

【问题讨论】:

  • 这是因为我在柔性环境中运行我的 Java 服务:github.com/googleapis/google-auth-library-java/blob/master/… 但是,我们如何在 Java 柔性环境中进行身份验证??
  • 我认为唯一的办法就是使用 json 服务帐户文件...
  • 我遇到了同样的问题。如果我设置了指向我试图模拟的服务帐户的本地 json 凭据文件的环境变量集(即使它是计算引擎默认服务帐户),我能够获得正确的 ServiceAccountCredentials。这发生在计算引擎实例上。你能解决这个问题吗?
  • 我没有尝试模拟身份验证,我只是尝试进行身份验证而无需提供 JSON 文件

标签: java google-app-engine google-cloud-platform google-iap


【解决方案1】:

您实际上并没有提及您所面临的困难的性质。 App Engine 柔性环境服务帐号是在 GCP 项目中自动创建的。您尝试创建的 App Engine 柔性环境服务帐户是独立于App Engine default service account 的服务帐户。 “返回 (ServiceAccountCredentials) 凭据;”语句使用强制转换返回 ServiceAccountCredentials;应该没问题。

行:GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(IAM_SCOPE) 创建一个 GoogleCredentials 对象,它不需要 JSON 服务帐户文件即可成功。

【讨论】:

  • 你看到我的评论了吗? DefaultCredentialsProvider.java:L195 AppEngine 标准只有一个测试
  • 另外,ServiceAccountCredentials 对象的测试是在演员表之前进行的。所以它总是会抛出异常"Google credentials : service accounts credentials expected"
  • 是的,系统会自动创建默认服务帐户,但在 Java 柔性环境中没有用。您注意到的行返回 ComputeEngineCredentials,因为无法使用默认服务帐户(即未设置环境变量)
  • 可以设置环境变量。详情可以查看“app.yaml 配置文件”页面的“定义环境变量”sub-chapter
  • 是的,我知道,但是如果我手动设置它们,我将无法使用默认服务帐户(文件路径应该由 gcp 自动处理)。与其他语言一样,我不必设置任何环境变量来使用默认凭据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多