2017-05-30 2 views
0

Nach der Recherche in der Google Compute-Dokumentation habe ich festgestellt, dass es kein Beispiel für die Authentifizierung über einen generierten Service Access Key gibt.Programmgesteuertes Authentifizieren bei Google Compute Engine über Dienstzugriffsschlüssel

Ich versuchte es mit dem folgenden Code (dies ist Zeile 69)

GoogleCredential credential = new GoogleCredential.Builder() 
       .setClientSecrets(authorize()) 
       .build(); 

und

private static GoogleClientSecrets authorize() { 
    // initialize client secrets object 
    GoogleClientSecrets clientSecrets; 
    // load client secrets 
    try { 
     clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(
       GCEImporter.class.getResourceAsStream("/client_secrets.json"))); 

    } catch(IOException e){ 
     e.printStackTrace(); 
     return null; 
    } 


    return clientSecrets; 
} 

die client_secrets.json ist die erzeugte Datei von Google, die wie dieses

{ 
"type": "service_account", 
"project_id": "...", 
"private_key_id": "...", 
"private_key": "-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----\n", 
"client_email": "....iam.gserviceaccount.com", 
"client_id": "...", 
"auth_uri": "https://accounts.google.com/o/oauth2/auth", 
"token_uri": "https://accounts.google.com/o/oauth2/token", 
"auth_provider_x509_cert_url": 
"https://www.googleapis.com/oauth2/v1/certs", 
"client_x509_cert_url": 
"https://www.googleapis.com/robot/v1/metadata/x509/..." 
} 
sieht

alles, was ich bei der Ausführung dieses Codes bekomme, ist

java.lang.IllegalArgumentException 
at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:111) 
at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37) 
at com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.getDetails(GoogleClientSecrets.java:82) 
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential$Builder.setClientSecrets(GoogleCredential.java:559) 
at net.bytesource.jira.asset.synchronization.importer.google.gce.GCEImporter.getAssets(GCEImporter.java:69) 
at net.bytesource.jira.asset.synchronization.importer.google.gce.GoogleImporterTest.getAssets(GoogleImporterTest.java:33) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 

Hat jemand eine Lösung für dieses Problem?

Antwort

1

Danke für Ihre Antwort Tuxdude. Ich habe es auch schon im Vorfeld versucht, indem ich das Beispiel von der Webseite kopiert habe. Dies funktioniert jedoch nur innerhalb einer Instanz in der GCE-Umgebung.

Ich habe die Lösung selbst, die eine statische Methode aus GoogleCredential Klasse war gefunden:

GoogleCredential.fromStream(new FileInputStreamReader("path/to/json")) 
0

Es gibt einige Probleme hier:

  • Der private Schlüssel info JSON-Datei, die Sie heruntergeladen, wenn Sie einen neuen Dienstkonto aus der IAM-Seite erstellt ist nicht in der format that is expected by Client Secrets.

  • Sie versuchen, die [OAuth steps that are meant for Desktop and mobile apps][2] zu folgen. Dies funktioniert nicht mit Google Cloud APIs.

Die empfohlene und einfachere Art und Weise mit Google Cloud APIs für die Zulassung von Anwendungsstandardanmeldeinformationen verwenden, die here und here beschrieben.

Kurz gesagt, was um Sie tun müssen, um (basierend auf dem Umriss here):

  1. den Pfad zu der JSON-Datei Sie in der Umgebungsvariablen GOOGLE_APPLICATION_CREDENTIALS gesetzt haben.

  2. Erstellen Sie das Objekt GoogleCredential wie unten gezeigt.

GoogleCredential credential = GoogleCredential.getApplicationDefault();

Nach dem obigen Schritt sollten Sie in der Lage sein, einen der Google Cloud-APIs zu sprechen. Im Falle der GCE, werden Sie eine Instanz von Compute

Compute compute = new Compute.Builder (transport, jsonFactory, credential).build();

Ich bin nur Kopieren und Einfügen das Beispiel von compute.instances.insert API here erstellen.

/* 
* BEFORE RUNNING: 
* --------------- 
* 1. If not already done, enable the Compute Engine API 
* and check the quota for your project at 
* https://console.developers.google.com/apis/api/compute 
* 2. This sample uses Application Default Credentials for authentication. 
* If not already done, install the gcloud CLI from 
* https://cloud.google.com/sdk and run 
* `gcloud beta auth application-default login`. 
* For more information, see 
* https://developers.google.com/identity/protocols/application-default-credentials 
* 3. Install the Java client library on Maven or Gradle. Check installation 
* instructions at https://github.com/google/google-api-java-client. 
* On other build systems, you can add the jar files to your project from 
* https://developers.google.com/resources/api-libraries/download/compute/v1/java 
*/ 
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.services.compute.Compute; 
import com.google.api.services.compute.model.Instance; 
import com.google.api.services.compute.model.Operation; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.util.Arrays; 

public class ComputeExample { 
    public static void main(String args[]) throws IOException, GeneralSecurityException { 
    // Project ID for this request. 
    String project = ""; // TODO: Update placeholder value. 

    // The name of the zone for this request. 
    String zone = ""; // TODO: Update placeholder value. 

    // TODO: Assign values to desired fields of `requestBody`: 
    Instance requestBody = new Instance(); 

    Compute computeService = createComputeService(); 
    Compute.Instances.Insert request = 
     computeService.instances().insert(project, zone, requestBody); 

    Operation response = request.execute(); 

    // TODO: Change code below to process the `response` object: 
    System.out.println(response); 
    } 

    public static Compute createComputeService() throws IOException, GeneralSecurityException { 
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
    JsonFactory jsonFactory = JacksonFactory.getDefaultInstance(); 

    GoogleCredential credential = GoogleCredential.getApplicationDefault(); 
    if (credential.createScopedRequired()) { 
     credential = 
      credential.createScoped(Arrays.asList("https://www.googleapis.com/auth/cloud-platform")); 
    } 

    return new Compute.Builder(httpTransport, jsonFactory, credential) 
     .setApplicationName("Google-ComputeSample/0.1") 
     .build(); 
    } 
} 
Verwandte Themen