如何使用Google Cloud客户端库进行基于API密钥的REST调用

时间:2017-12-21 08:34:48

标签: go google-cloud-platform api-key google-cloud-vision

我尝试使用Golang的API密钥对Google Cloud Vision API进行API调用。但是我得到了400: bad request, invalid_grant error

以下代码的apiKey / apiKeyOption部分是我的。

拨打此电话的正确方法是什么?它有可能吗?

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"
}

2 个答案:

答案 0 :(得分:3)

根据我在Golang的Google Cloud客户端库的官方文档(GitHubGolang documentation中)中找到的内容,当前支持的身份验证方法是 Google Application Default Credentials < / strong>和服务帐户,因此没有此选项可使用API​​密钥进行身份验证。

但是,正如in the documentation所指出的,出于安全原因,Google建议使用服务帐户而不是API密钥,因此如果可以的话,我建议您使用该选项。

  

调用不需要的Google API时,可以使用API​​密钥   身份验证以及使用Google Cloud Endpoints时。 为了安全起见   原因,我们建议使用服务帐户

答案 1 :(得分:0)

@dsesto是对的,使用服务帐户进行身份验证总是更好。但是,如果您想使用API​​密钥,它应该可以正常工作。

我在该库上打开了github issue来解释错误。

使用curl的相同请求正常工作(无凭证):

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"
    }
   ]
  }
 ]
}'