我在GCP Cloud Run上部署了两个服务(API),称之为service-one.myDomain.com
和service-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.com
向service-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
?
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