google-cloud-platform - Google Cloud Run 身份验证服务到服务

标签 google-cloud-platform google-oauth google-authentication google-cloud-run google-iam

我在 GCP Cloud Run 上部署了两个服务 (API)。称它们为 service-one.myDomain.comservice-two.myDomain.com 。我希望在调用 service-2 时对 service-one 进行身份验证,而不管任何用户在做什么。
我已经阅读并实现了 GCP Cloud Run 文档中关于 Authenticating service-to-service ( https://cloud.google.com/run/docs/authenticating/service-to-service ) 的说明,但 service-one.myDomain.com 未能成功调用 service-two.myDomain.com 接收 401:Unauthorized 响应。
关于如何让 service-one 成功调用 service-two 的任何想法?
这是我的设置:
IAM 和服务帐户:
在 google IAM 上,我创建了两个服务帐户并授予它们“Cloud Run Invoker”( roles/run.invoker ) 角色:service-one@myproject.iam.gserviceaccount.comservice-two@myproject.iam.gserviceaccount.com在 Cloud Run 中,我将服务帐户从“默认计算服务帐户”更改为我创建的服务帐户。我为 service-one@myproject.iam.gserviceaccount.com 分配了 service-one.myDomain.com,为 service-two@myproject.iam.gserviceaccount.com 分配了 service-two.myDomain.comOIDC 身份验证 token :
service-one.myDomain.com 中,我调用元数据服务器以从以下 url 获取 token (jwt):http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://service-two.myDomain.com 请求头设置为 {'Metadata-Flavor': 'Google'} 请求成功,我收到的 token 被解码为具有以下有效负载:

{
  "alg": "RS256",
  "kid": "9cef5340642b157fa8a4f0d874fe7543872d82db",
  "typ": "JWT"
}

{
  "aud": "https://service-two.mydomain.com",
  "azp": "100959068407876085761",
  "email": "service-one@myproject.iam.gserviceaccount.com",
  "email_verified": true,
  "exp": 1572806540,
  "iat": 1572802940,
  "iss": "https://accounts.google.com",
  "sub": "100953168404568085761"
}
Http请求:
使用 token ,我从 service-one.myDomain.comservice-two.myDomain.com 上的 http 端点发出请求。我使用 {'Authorization': 'Bearer {token}'} 设置请求 header ({token} 是 token 的值)。
Http响应:
响应是 401 Unauthorized,我的日志显示响应 header 包括:{'WWW-Authenticate': 'Bearer error="invalid_token" error_description="The access token could not be verified"'}内容如下:
"
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>401 Unauthorized</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Unauthorized</h1>
<h2>Your client does not have permission to the requested URL <code>/health</code>.</h2>
<h2></h2>
</body></html>
" 
我很难过......关于我缺少什么让 service-oneservice-two 进行身份验证的任何想法?

最佳答案

答案是使用 gcp cloud run 生成的 Url 作为 OIDC token 请求中的受众。以及相关的 jwt 中的“aud”字段。

我的发现是云运行中的服务到服务身份验证不支持自定义域 (myDomain.com)。我正在使用我的自定义域。

(我觉得自己像个傻瓜)谢谢@guillaumeblaquiere

关于google-cloud-platform - Google Cloud Run 身份验证服务到服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58683365/

相关文章:

java - 如何从 Android 访问内置 Google Apps 脚本 'Web App'?

javascript - Google OAuth 通配符域

android - Google API : java. lang.ClassNotFoundException:找不到类 "sun.misc.Service"

mysql - 如何将 Node 应用程序重新连接到新的 Google Cloud SQL 数据库?

google-cloud-platform - 如何针对特定语言改进 Google Vision API 的 TEXT_DETECTION

ubuntu - 在 Ubuntu 18 上安装 gcloud/gsutil

Android oAuth 刷新 token 返回 null

api - Firefox OS OAuth 2.0 程序

javascript - googleapis TypeError : authClient. 请求不是 nodejs 中的函数

google-cloud-platform - 如何将现有 Google Cloud 项目连接到 Google Playstore 控制台用户?