JavaからGoogleクラウドファイル名を指定して実行を呼び出し

Gabber235:

私は、外部アプリケーションからクラウドファイル名を指定して実行を起動します。外部アプリケーションは、Kotlin(Java)の中に書かれており、JDK 11 JVM上で実行されます。これは、サービスアカウントを使用して認証します

ServiceAccountCredentials.fromStream(serviceAccount).createScoped("https://www.googleapis.com/auth/cloud-platform")

サービスアカウントには有効なJSONファイルさです。私はGoogleのクラウドコンソール内のサービスアカウントの実行クラウドを呼び出すための権限をテストしています。

私は、HTTP POST要求を実行するために、GoogleのGoogleNetHttpTransportを使用して、私は公式のAPIを発見していません。私が使用しようとした雲の実行起動するには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

そして私は、ジェットサービスアカウントを使用して使用しようとしました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)

事前にご支援をありがとう

ギヨームBlaquiere:

私はのOAuth2 Javaライブラリに時間を費やし、問題は以下の通りです。クラスがServiceAccountCredentials追加AccessToken承認として、そしてクラスがServiceAccountJwtAccessCredentials追加自己署名します identity token

私はそれに深くなりますが、今のために、手動でヘッダーを設定することができます

        String myUri = "https://.....";

        Credentials credentials =  ServiceAccountCredentials
                .fromStream(resourceLoader.getResource("classpath:./key.json")
                        .getInputStream()).createScoped("https://www.googleapis.com/auth/cloud-platform");

        String token = ((IdTokenProvider)credentials).idTokenWithAudience(myUri, Collections.EMPTY_LIST).getTokenValue();

        HttpRequestFactory factory = new NetHttpTransport().createRequestFactory();
        HttpRequest request = factory.buildGetRequest(new GenericUrl(myUri));
        HttpHeaders headers = new HttpHeaders();
        headers.set("Authorization","Bearer " + token);
        request.setHeaders(headers);
        HttpResponse httpResponse = request.execute();
        System.out.println(CharStreams.toString(new InputStreamReader(httpResponse.getContent(), Charsets.UTF_8)));

作品はここですが、一緒に動作しません。

EDIT

GitHubの上でいくつかの交換の後、Googleは私にソリューションを提供します。今ヘッダは自動的に署名されたIDトークンがプロビジョニングされています

        Credentials credentials =  ServiceAccountCredentials
                .fromStream(resourceLoader.getResource("classpath:./key.json")
                        .getInputStream()).createScoped("https://www.googleapis.com/auth/cloud-platform");


        IdTokenCredentials idTokenCredentials = IdTokenCredentials.newBuilder()
                .setIdTokenProvider((ServiceAccountCredentials)credentials)
                .setTargetAudience(myUri).build();

        HttpRequestFactory factory = new NetHttpTransport().createRequestFactory(new HttpCredentialsAdapter(idTokenCredentials));
        HttpRequest request = factory.buildGetRequest(new GenericUrl(myUri));
        HttpResponse httpResponse = request.execute();
        System.out.println(CharStreams.toString(new InputStreamReader(httpResponse.getContent(), Charsets.UTF_8)));

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=401068&siteId=1