2017-12-21 8 views
0

Ich versuche mit einem API-Schlüssel von Golang einen API-Aufruf an die Google Cloud Vision API zu senden. Aber ich bekomme eine 400: bad request, invalid_grant error.So führen Sie einen API-Key-basierten REST-Anruf mit der Google Cloud-Client-Bibliothek durch

Der apiKey/apiKeyOption Teil des folgenden Codes gehört mir.

Was ist der richtige Weg, um diesen Anruf zu tätigen? Ist es überhaupt möglich?

import (
    // ... 
    "google.golang.org/api/option" 
    vision "cloud.google.com/go/vision/apiv1" 
    "golang.org/x/net/context" 
) 

func getImageLabels(filename string) []string { 

    ctx := context.Background() 

    apiKey := "..." // I have a valid api key generated in the console. 
    apiKeyOption := option.WithAPIKey(apiKey) 

    client, err := vision.NewImageAnnotatorClient(ctx, apiKeyOption) 

    // ... 
    labels, err := client.DetectLabels(ctx, image, nil, 10) 

} 

...

Failed to detect labels: rpc error: code = Internal desc = transport: oauth2: cannot fetch token: 400 Bad Request 
Response: { 
    "error" : "invalid_grant" 
} 
+0

Ich habe jetzt diese ohne die Client-Bibliotheken als regulärer REST Aufruf umgesetzt. Aber immer noch interessiert zu wissen, ob es mit den Client-Bibliotheken möglich ist. – sathishvj

Antwort

4

Nach dem, was ich in der offiziellen Dokumentation (beide in GitHub und Golang documentation) der Google Cloud-Client-Bibliotheken für Golang, die aktuellen unterstützten Authentifizierungsmethoden sind Google gefunden Standardanmeldeinformationen für die Anwendung und Dienstkonten, daher gibt es keine solche Option zur Authentifizierung mit einem API-Schlüssel.

Wie jedoch bereits erwähnt wurde, empfiehlt Google aus Sicherheitsgründen, anstelle von API-Schlüsseln Dienstkonten zu verwenden, daher würde ich vorschlagen, dass Sie diese Option verwenden, wenn Sie können.

API-Schlüssel können verwendet werden, wenn Google-APIs aufgerufen werden, die keine -Authentifizierung erfordern und wenn Google Cloud Endpoints verwendet wird. Für die Sicherheit Gründe, empfehlen wir stattdessen Dienstkonten verwenden.

0

@ dsesto ist richtig, es ist immer besser, ein Dienstkonto zu verwenden, um sich zu authentifizieren. Wenn Sie jedoch einen API-Schlüssel verwenden möchten, sollte es funktionieren.

Ich habe eine github issue auf dieser Bibliothek geöffnet, die den Fehler erklärt.

Die gleiche Anforderung mit curl korrekt funktioniert (keine Anmeldeinformationen):

curl https://vision.googleapis.com/v1/images:annotate?key=<API_KEY> -H'content-type:application/json' -d'{ 
"requests": [ 
    { 
    "image": { 
    "source": { 
    "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/1200px-Google_2015_logo.svg.png" 
    } 
    }, 
    "features": [ 
    { 
    "type": "LABEL_DETECTION" 
    } 
    ] 
    } 
] 
}' 
Verwandte Themen