У меня есть две службы (API), развернутые в GCP Cloud Run. Назовите их 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@myproject.iam.gserviceaccount.com
для service-one.myDomain.com
и service-two@myproject.iam.gserviceaccount.com
для service-two.myDomain.com
токен OAuth:
В service-one.myDomain.com
я делаювызовите сервер метаданных, чтобы получить токен OAuth (jwt) из следующего URL: 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
к конечной точке http на service-two.myDomain.com
. Я установил заголовок запроса с помощью {'Authorization': 'Bearer {token}'}
({token}
- значение токена).
Http-ответ:
Ответ - 401 Unauthorized, и мои журналы показывают, что заголовки ответа включают:
{'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
?