Я хочу вызвать Cloud Run из внешнего приложения. Внешнее приложение написано в Kotlin (java) и работает на JDK JDK 11. Он аутентифицируется с использованием служебной учетной записи
ServiceAccountCredentials.fromStream(serviceAccount).createScoped("https://www.googleapis.com/auth/cloud-platform")
, где служебная учетная запись является действительным JSON файлом. Я проверил разрешения для запуска облачного запуска для учетной записи службы в облачной консоли Google.
Я не нашел официального API, поэтому использовал GoogleNetHttpTransport Google для запуска HTTP-запроса на публикацию. Для запуска облачного запуска я попытался использовать HttpCredentialsAdapter
transport.createRequestFactory(HttpCredentialsAdapter(googleCredentials))
.buildPostRequest(GenericUrl(url), JsonHttpContent(JacksonFactory(), data))
Я пытался использовать токен доступа directy
val headers = HttpHeaders()
googleCredentials.refreshIfExpired()
headers.authorization = "Bearer " + googleCredentials.accessToken.tokenValue
postRequest.headers = headers
И я пытался использовать учетную запись службы Jet и использовать метаданные jwt запроса
val headers = HttpHeaders()
jwtCredentials = ServiceAccountJwtAccessCredentials.fromStream(serviceAccount)
jwtCredentials.getRequestMetadata(URI(url)).forEach {
headers.set(it.key, it.value)
}
postRequest.headers = headers
Во всех этих случаях он возвращает эту ошибку
[20:35:00 WARN]: Exception in thread "TestThread" com.google.api.client.http.HttpResponseException: 401 Unauthorized
[20:35:00 WARN]: at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1113)
[20:35:00 WARN]: at ***.CloudRun$invoke$3.invokeSuspend(CloudRun.kt:34)
[20:35:00 WARN]: at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
[20:35:00 WARN]: at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
[20:35:00 WARN]: at java.base/java.lang.Thread.run(Thread.java:834)
Спасибо за вашу поддержку заранее