当前位置: 首页 > 知识库问答 >
问题:

Google云任务无法验证云运行

耿和韵
2023-03-14

我试图使用云任务调用云运行服务,如文档中所述。

我有一个运行云运行服务。如果我让服务公开访问,它的行为将与预期的一样。

我已经创建了一个云队列,并使用本地脚本调度云任务。这个用的是我自己的账户。脚本如下所示

from google.cloud import tasks_v2

client = tasks_v2.CloudTasksClient()

project = 'my-project'
queue = 'my-queue'
location = 'europe-west1'
url = 'https://url_to_my_service'

parent = client.queue_path(project, location, queue)

task = {
        'http_request': {
            'http_method': 'GET',
            'url': url,
            'oidc_token': {
               'service_account_email': 'my-service-account@my-project.iam.gserviceaccount.com'
            }
        }
}

response = client.create_task(parent, task)
print('Created task {}'.format(response.name))
    null
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://url_to_my_service

最后的测试:如果我在创建任务时从任务中删除oidc_token,我将从Cloud Run得到一个403响应!不是401...如果我从服务帐户中删除“Cloud Run Invoker”角色并在本地使用curl重试,我也会得到403而不是401。

如果我最终使云运行服务公开访问,一切都正常。

因此,云任务似乎无法为服务帐户生成令牌,以便在云运行服务上正确地进行身份验证。

我错过了什么?

共有1个答案

漆雕奇
2023-03-14

我在这里有同样的问题,这是我的修复:

诊断:生成OIDC令牌目前不支持访问群体参数中的自定义域。我为我的云运行服务使用了一个自定义域(https://my-service.my-domain.com),而不是云运行生成的url(在云运行服务仪表板中找到),该url如下所示:https://xxxxxxx.run.app

掩蔽行为:在排队到云任务的任务中,如果没有显式设置oidc_token的访问群体字段,则使用任务的目标url来设置OIDC令牌请求中的访问群体

在我的示例中,这意味着将任务排队发送到目标https://my-service.my-domain.com/resource生成OIDC令牌的受众设置为我的自定义域https://my-service.my-domain.com/resource。因为在生成OIDC令牌时不支持自定义域,所以我收到了来自目标服务的401未授权响应。

我的修复:用云运行生成的URL显式地填充受众,以便发出有效的令牌。在我的客户机中,我能够全局设置针对给定服务的所有任务的访问群体,其基本URL:'vaturey':'https://xxxxxx.run.app'。这生成了一个有效的令牌。我不需要更改目标资源本身的url。资源保持不变:'url':'https://my-service.my-domain.com/resource'

更多阅读:我以前在设置服务到服务身份验证时遇到过这个问题:Google Cloud run Authentication service-to-service

 类似资料:
  • 我被难倒了....对于获得向缺少什么,有什么想法吗?

  • 我正在谷歌云平台上工作,我必须使用java非Web应用程序访问云功能,就像我正在尝试使用谷歌云存储JSON API存储和检索谷歌云存储中的对象一样。 在访问这些之前,我需要对我的应用程序进行身份验证,所以我找到了授权API来进行授权访问。 null 我浏览了GCP文档,但没有得到区分这些文档的明确信息,我对GCP非常陌生,所以请您分享任何信息或博客链接,以说明如何使用Google Cloud Cl

  • 所以我想 是否可以在Cloud Foundry上部署一个应用程序,并像在linux控制台上一样启动这个jar。

  • 将配置服务器用户名和密码存储为环境变量(在客户端和服务器中)还是使用密钥库更好?密钥库密码无论如何都存储为环境变量,那么为什么实际使用密钥库呢?还是有更好的方法在SpringCloudConfig服务器中实现身份验证?

  • 这是一个很好的OAuth2用例吗?还是OAuth2仅用于授予第三方应用程序对用户数据的访问权限? 如果OAuth2不是可行的方法:如何将用户令牌安全地传递给浏览器,并防止中间人攻击?用户令牌应该在一定时间后过期吗?

  • 我有一个flask应用程序,它同时运行flask和flask-socketioendpoint。当我在google App engine上部署时,我意识到App engine不支持websockets。这意味着我需要为我的flask-socketio使用compute engine,并为我假设的常规flaskendpoint使用app engine。我将如何创建这两个实例,并在相互连接的同时并行运