Google 云 运行 身份验证 Service-to-Service
Google Cloud Run Authentication Service-to-Service
我在 GCP Cloud 运行 上部署了两个服务 (API)。称他们为 service-one.myDomain.com
和 service-two.myDomain.com
。我希望 service-one 在调用 service-two 时得到验证,而不管任何用户在做什么。
我已经阅读并实施了 GCP Cloud 运行 文档中有关身份验证 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 上,我创建了两个服务帐户并授予它们“云 运行 调用者”(roles/run.invoker
) 角色:
service-one@myproject.iam.gserviceaccount.com
service-two@myproject.iam.gserviceaccount.com
Inside Cloud 运行 我将服务帐户从“默认计算服务帐户”更改为我创建的服务帐户。我为 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
请求 header 设置为 {'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 端点发出请求。我将请求 header 设置为 {'Authorization': 'Bearer {token}'}
({token}
是令牌的值)。
HTTP 响应:
响应是 401 Unauthorized,我的日志显示响应 headers 包括:
{'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
进行身份验证的任何想法?
答案是使用 gcp 云 运行 生成 Url 作为 OIDC 令牌请求中的受众。与此相关的是 jwt 中的 "aud" 字段。
我发现云中的服务到服务身份验证 运行 不支持自定义域 (myDomain.com)。我正在使用我的自定义域。
(我觉得自己像个笨蛋)谢谢@guillaumeblaquiere
我在 GCP Cloud 运行 上部署了两个服务 (API)。称他们为 service-one.myDomain.com
和 service-two.myDomain.com
。我希望 service-one 在调用 service-two 时得到验证,而不管任何用户在做什么。
我已经阅读并实施了 GCP Cloud 运行 文档中有关身份验证 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 上,我创建了两个服务帐户并授予它们“云 运行 调用者”(roles/run.invoker
) 角色:
service-one@myproject.iam.gserviceaccount.com
service-two@myproject.iam.gserviceaccount.com
Inside Cloud 运行 我将服务帐户从“默认计算服务帐户”更改为我创建的服务帐户。我为 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
请求 header 设置为 {'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 端点发出请求。我将请求 header 设置为 {'Authorization': 'Bearer {token}'}
({token}
是令牌的值)。
HTTP 响应:
响应是 401 Unauthorized,我的日志显示响应 headers 包括:
{'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
进行身份验证的任何想法?
答案是使用 gcp 云 运行 生成 Url 作为 OIDC 令牌请求中的受众。与此相关的是 jwt 中的 "aud" 字段。
我发现云中的服务到服务身份验证 运行 不支持自定义域 (myDomain.com)。我正在使用我的自定义域。
(我觉得自己像个笨蛋)谢谢@guillaumeblaquiere