谷歌云运行身份验证服务对服务的身份验证

12

我在GCP Cloud Run上部署了两个服务(API),称之为service-one.myDomain.comservice-two.myDomain.com。 我想要service-one在独立于任何用户所做的操作的情况下调用service-two进行身份验证。

我已经阅读并实施了GCP Cloud Run文档中有关服务间身份验证的说明(https://cloud.google.com/run/docs/authenticating/service-to-service),但service-one.myDomain.com在调用service-two.myDomain.com时失败,并收到401:未授权的响应。

有什么想法可以让service-one成功调用service-two吗?

以下是我的设置:

IAM和服务帐户:

在Google IAM上,我创建了两个服务帐户,并向它们都授予了“Cloud Run Invoker” (roles/run.invoker) 角色: service-one@myproject.iam.gserviceaccount.com service-two@myproject.iam.gserviceaccount.com

在Cloud Run中,我将服务帐户从“默认计算服务帐户”更改为我创建的服务帐户。我为service-one.myDomain.com分配了service-one@myproject.iam.gserviceaccount.com,并为service-two.myDomain.com分配了service-two@myproject.iam.gserviceaccount.com

OIDC身份验证令牌:

service-one.myDomain.com中,我调用元数据服务器从以下URL获取令牌(JWT): http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://service-two.myDomain.com,并将请求头设置为{'Metadata-Flavor': 'Google'} 请求成功,我收到的令牌被解码为具有以下有效载荷:

{
  "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请求:

我使用令牌从service-one.myDomain.comservice-two.myDomain.com上的HTTP端点发出请求。 我使用{'Authorization':'Bearer {token}'}设置请求头(其中{token}是令牌的值)。

HTTP响应:

响应是401未经授权,我的日志显示响应头包括:

{'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-one认证到service-two?


1
你能执行这个命令吗:gcloud beta run services get-iam-policy <service-two>(将 service-two 替换为实际名称)?还有这个命令 gcloud iam service-accounts get-iam-policy <service-one@myproject.iam.gserviceaccount.com>(同样进行正确的替换)?最后一个问题,你使用自定义域名吗? - guillaume blaquiere
所以我感觉自己像个笨蛋,@guillaumeblaquiere你的评论让我找到了答案。我正在使用自定义域名。文档中确实说不支持自定义域名。在将我的自定义域名替换为Cloud Run生成的URL后,service-one能够成功地向service-two发出请求。 - teaMonkeyFruit
很高兴能帮忙 :-) - guillaume blaquiere
1个回答

13
答案是:使用gcp Cloud Run生成的URL作为OIDC令牌请求中的受众。 相关的,“jwt”中的“aud”字段。
我的发现是,在Cloud Run中进行服务对服务身份验证不支持自定义域名(myDomain.com)。 我之前一直在使用自定义域名。
感谢@guillaumeblaquiere提供的帮助,我感觉自己很蠢。

1
正确,生成身份令牌的audience参数目前不支持自定义域。 - ahmet alp balkan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接