GCP IAP Java示例返回ComputengineCredentials而不是ServiceAccountCredentials 上下文

GCP IAP Java示例返回ComputengineCredentials而不是ServiceAccountCredentials 上下文,java,google-app-engine,google-cloud-platform,google-iap,Java,Google App Engine,Google Cloud Platform,Google Iap,我在GoogleAppengine灵活的环境中有一些服务,通过API进行通信,同时我使用IAP管理用户访问。我必须以编程方式使用Bearer JWT令牌对每个服务进行身份验证 问题 在我的Java应用程序中,我使用google提供的代码来验证IAP服务,您可以在这里找到: 问题出在这段代码中: google认证= GoogleCredentials.getApplicationDefault().createScope(Collections.singleton(IAM_SCOPE)); //签

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

问题 在我的Java应用程序中,我使用google提供的代码来验证IAP服务,您可以在这里找到:

问题出在这段代码中:

google认证=
GoogleCredentials.getApplicationDefault().createScope(Collections.singleton(IAM_SCOPE));
//签署jwt令牌需要服务帐户凭据
if(凭证==null | |!(凭证实例为ServiceAccountCredentials)){
抛出新异常(“Google凭据:需要服务帐户凭据”);
}
返回(ServiceAccountCredentials)凭据;
createScoped
方法返回一个
computenginecredentials
,而代码需要一个
ServiceAccountCredentials
响应对象


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

你实际上没有提到你所面临的困难的性质。 App Engine flexible environment service帐户是在GCP项目中自动创建的。您是否尝试创建App Engine flexible environment服务帐户,该帐户是一个独立于的服务帐户。 “return(ServiceAccountCredentials)credentials;”语句使用强制转换返回ServiceAccountCredentials;应该没问题


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

之所以发生这种情况,是因为我在灵活的环境中运行Java服务:但是,我们如何在灵活的Java环境中进行身份验证?我想唯一的方法是使用JSON服务帐户文件……我遇到了同样的问题。如果设置了指向我试图模拟的服务帐户的本地json凭据文件的环境变量(即使它是计算引擎默认服务帐户),则我能够获得正确的ServiceAccountCredentials。这发生在一个计算引擎实例上。你能解决这个问题吗?我没有尝试模拟身份验证,我只是尝试在不提供JSON文件的情况下进行身份验证。你看到我的评论了吗?
DefaultCredentialsProvider.java:L195
只有AppEngine标准有一个测试所以
ServiceAccountCredentials
对象是在强制转换之前创建的。因此它将始终引发异常
“Google凭据:预期的服务帐户凭据”
是的,默认服务帐户是自动创建的,但在Java flexible环境中无效。您注意到的行返回ComputengineCredentials,因为无法使用默认服务帐户(即未设置环境变量),因此可以设置环境变量。有关详细信息,请参阅“app.yaml配置文件”页面上的“定义环境变量”。是的,我知道,但是,如果我手动设置它们,我就不能使用默认服务帐户(文件路径应该由gcp自动处理)。与其他语言一样,我不必设置任何环境变量来使用默认凭据。