Аутентификация с помощью библиотеки API Google для Java в облаке Google

Я пытаюсь создать несколько виртуальных машин GCP, используя клиентские библиотеки API для Java, но примеры, которые я видел, кажутся старыми. Я начал с этого https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/compute/cmdline/src/main/java/ComputeEngineSample.java, но похоже, что класс GoogleCredential устарел. После некоторых исследований я придумал этот код

        JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
        GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
        if (credentials.createScopedRequired()) {
            List<String> scopes = new ArrayList<>();
            scopes.add(ComputeScopes.DEVSTORAGE_FULL_CONTROL);
            scopes.add(ComputeScopes.DEVSTORAGE_READ_WRITE);
            credentials = credentials.createScoped(scopes);
        }
        Compute compute = new Compute.Builder(httpTransport, jsonFactory, null)
            .setApplicationName("et").build();
        Compute.Instances.List instancesList = compute.instances().list("<GCP-PROJECT>", "us-central1-a");
        InstanceList executedOperation = instancesList.execute();

Затем я установил переменную среды GOOGLE_APPLICATION_CREDENTIALS в путь к json-файлу моей учетной записи службы и запустил свой код, но он не работает с ошибкой 401 Unauthorized. Частичное сообщение это

"message" : "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential.

Примеры, которые я вижу, относятся к другим продуктам Google, таким как Storage, Pubsub и т. д., но я не могу найти подходящего примера того, как использовать мои учетные данные для вызова некоторых операций в службе Compute. Любая помощь будет оценена по достоинству.


person Ramesh Venkitaswaran    schedule 13.05.2020    source источник
comment
Это должно помочь: github.com/GoogleCloudPlatform/java-docs-samples/blob/master/   -  person DazWilkin    schedule 14.05.2020
comment
Как вы, я думаю, знаете, как только вы узнаете, как использовать одну службу Google через клиентскую библиотеку API, все остальные будут работать аналогично. Google движется к облачным клиентским библиотекам, но Compute Engine (пока) не сделал этого.   -  person DazWilkin    schedule 14.05.2020
comment
Спасибо. Но я уже посмотрел на них (пожалуйста, смотрите мой оригинальный пост). В примере в этом репо используются устаревшие классы, такие как GoogleCredential, а параметры для Compute.Builder неверны. Так что я все еще застрял.   -  person Ramesh Venkitaswaran    schedule 14.05.2020
comment
Я только что попробовал это для вас, и код работает для меня.   -  person DazWilkin    schedule 14.05.2020
comment
Я смог заставить его работать с вашим предложением, но все еще есть некоторые проблемы. Как я упоминал ранее, GoogleCredential является устаревшим классом, и компилятор выдает предупреждение. Однако эта часть меня озадачивает: конструктор Compute.Builder принимает HttpTransport, JsonFactory, HttpRequestInitializer, но передача GoogleCredential, похоже, работает. Есть идеи, почему?   -  person Ramesh Venkitaswaran    schedule 14.05.2020
comment
Я обновлю ответ, используя google-auth-library. Я не очень много пишу на Java, поэтому я недостаточно знаком с библиотеками аутентификации Google на Java.   -  person DazWilkin    schedule 14.05.2020
comment
Идеально - HttpRequestInitializer - это недостающая часть, которая мне была нужна. Большое спасибо   -  person Ramesh Venkitaswaran    schedule 14.05.2020
comment
Всегда пожалуйста!   -  person DazWilkin    schedule 14.05.2020


Ответы (1)


Я взял образец Google, и он работает для меня.

Я сократил его, чтобы перечислить только экземпляры.

PROJECT=
ZONE=
INSTANCE=
ACCOUNT=

gcloud projects create ${PROJECT}

gcloud alpha billing projects link ${PROJECT} \
--billing-account=${BILLING}

gcloud services enable compute.googleapis.com \
--project=${PROJECT}

# Create an instance to enumerate
gcloud compute instances create instance-1 \
--project=${PROJECT}  \
--zone=${ZONE} \
--machine-type=f1-micro \
--image-family=debian-10 \
--image-project=debian-cloud \
--preemptible

gcloud iam service-accounts create ${ACCOUNT} \
--project=${PROJECT}

gcloud iam service-accounts keys create ./${ACCOUNT}.json \
--iam-account=${ACCOUNT}@${PROJECT}.iam.gserviceaccount.com \
--project=${PROJECT}

# Overly broad permissions but...
gcloud projects  add-iam-policy-binding ${PROJECT} \
--member=serviceAccount:${ACCOUNT}@${PROJECT}.iam.gserviceaccount.com \
--role=roles/compute.admin

export GOOGLE_APPLICATION_CREDENTIALS=./${ACCOUNT}.json
mvn exec:java -Dexec.mainClass="com.dazwilkin.gce.App"

выходы (отредактировано для ясности):

[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------< com.dazwilkin.gce:gce >------------------------
[INFO] Building gce 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ gce ---
Hello Freddie!
================== Listing Compute Engine Instances ==================
{
  "id" : "6020825766320745087",
  "kind" : "compute#instance",
  "name" : "instance-1",
}
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.088 s
[INFO] Finished at: 2020-05-13T17:54:51-07:00
[INFO] ------------------------------------------------------------------------

и pom.xml:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.dazwilkin.gce</groupId>
  <artifactId>gce</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>gce</name>
  <url>http://maven.apache.org</url>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.9</source>
          <target>1.9</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>com.google.api-client</groupId>
      <artifactId>google-api-client</artifactId>
      <version>1.30.9</version>
    </dependency>
    <dependency>
      <groupId>com.google.apis</groupId>
      <artifactId>google-api-services-compute</artifactId>
      <version>v1-rev235-1.25.0</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Обновление: google-auth-library

Из документов google-auth-library:


import com.google.auth.Credentials;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.http.HttpCredentialsAdapter;

import com.google.api.client.http.HttpRequestInitializer;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class App 
{

    public static void main(String[] args )
    {

    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
    ...

    HttpRequestInitializer requestInitializer =
        new HttpCredentialsAdapter(credentials);
    Compute compute =
        new Compute.Builder(httpTransport, JSON_FACTORY, requestInitializer)
            .setApplicationName(APPLICATION_NAME)
            .build();
    ...

}

с pom.xml:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.dazwilkin.gce</groupId>
  <artifactId>gce</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>gce</name>
  <url>http://maven.apache.org</url>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.9</source>
          <target>1.9</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>com.google.api-client</groupId>
      <artifactId>google-api-client</artifactId>
      <version>1.30.9</version>
    </dependency>
    <dependency>
      <groupId>com.google.apis</groupId>
      <artifactId>google-api-services-compute</artifactId>
      <version>v1-rev235-1.25.0</version>
    </dependency>
    <dependency>
      <groupId>com.google.auth</groupId>
      <artifactId>google-auth-library-credentials</artifactId>
      <version>0.20.0</version>
    </dependency>
    <dependency>
      <groupId>com.google.auth</groupId>
      <artifactId>google-auth-library-oauth2-http</artifactId>
      <version>0.20.0</version>
    </dependency>
  </dependencies>
</project>
person DazWilkin    schedule 14.05.2020