我尝试使用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"
}
答案 0 :(得分:3)
根据我在Golang的Google Cloud客户端库的官方文档(GitHub和Golang 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"
}
]
}
]
}'