我正在尝试使用Cloud Tasks HTTP请求到达受Cloud IAP保护的HTTPS负载均衡器后面的Kubernetes端点。
端点可以使用任何Gsuite公司帐户运行,但是在执行Cloud Task时,这是Cloud Audit-数据访问日志(仅显示重要部分)
authenticationInfo: {
}
authorizationInfo: [
0: {
permission: "iap.webServiceVersions.accessViaIAP"
resource: "projects/<PROJECT_NUMBER>/iap_web/compute/services/<SERVICE_NUMBER>/versions/bs_0"
resourceAttributes: {
service: "iap.googleapis.com"
type: "iap.googleapis.com/WebServiceVersion"
}
}
]
status: {
code: 7
message: "PERMISSION_DENIED"
}
我正在使用计算引擎服务帐户创建任务,因此我已授予该帐户适当的权限:
创建任务时,我会将适当的OIDC服务帐户电子邮件添加到http请求中
'oidc_token': {'service_account_email': <PROJECT_NUMBER>-compute@developer.gserviceaccount.com}}
我还检查了另一个端点上的Cloud Tasks HTTP请求,并显示了身份验证承载令牌。
我现在真的不知道如何使其工作。 感谢您的帮助
答案 0 :(得分:1)
我发现了问题,OIDC需要特定的受众才能使用Cloud IAP。
所需的受众是可以在API和服务>凭据下的OAuth 2.0客户端ID部分中找到的IAP客户端ID,其名称以IAP开头。
这里仅作为示例,是添加可被Cloud IAP授予访问权限的任务的python代码。
# This is the important part, the audience filed is very important!
oidc_token = {'service_account_email': <PROJECT_NUMBER>-compute@developer.gserviceaccount.com, 'audience': <PROJECT_NUMBER>-<NUMBER_GENERATED_AUTOMATICALLY_BY_IAP>.apps.googleusercontent.com}
http_request = {'http_method': 'POST', 'url': url, 'body': json.dumps(payload).encode(), 'headers': headers, 'oidc_token': oidc_token}
task['schedule_time'] = timestamp
created_task = client.create_task(parent, {'http_request': http_request})