2016-10-08 2 views
0

Я написал тестовый код для перечисления ведер из Google Cloud Storage через API Cloud Storage, однако я получаю ошибку ниже, когда я запускаю код:Использование Google Cloud Storage API с Go AppEngine

googleapi: Error 403: Forbidden, forbiddenFinished 

Я проверил разрешения, и учетная запись службы appengine имеет доступ к ведрам, и приложение appengine app и облачное хранилище находятся в одном проекте.

Это мой пример кода:

package src 

import (
    "fmt" 
    "net/http" 
    "golang.org/x/oauth2/google" 
    storage "google.golang.org/api/storage/v1" 
    appengine "google.golang.org/appengine" 
) 

func init() { 
    http.HandleFunc("/", index) 
} 

func ListBuckets(r *http.Request, projectID string) ([]*storage.Bucket, error) { 

    ctx := appengine.NewContext(r) 

    client, err := google.DefaultClient(ctx, storage.DevstorageReadOnlyScope) 
    if err != nil { 
     return nil, err 
    } 

    service, err := storage.New(client) 
    if err != nil { 
     return nil, err 
    } 

    buckets, err := service.Buckets.List(projectID).Do() 
    if err != nil { 
     return nil, err 
    } 

    return buckets.Items, nil 
} 

func index(w http.ResponseWriter, r *http.Request) { 
    r.Header.Set("x-goog-project-id", "theIdProvidedByTheAPI") 
    bucket, err := ListBuckets(r,"myProject") 
    if err != nil { 
     fmt.Fprint(w,err.Error()) 
    } 
    for i:=range bucket { 
    fmt.Fprint(w,bucket[i].Name) 
    } 
    fmt.Fprint(w,"\n","Finished.") 

} 

И это файл YAML:

application: myProject 
version: alpha-001 
runtime: go 
api_version: go1 

handlers: 

- url:/
    script: _go_app 

сообщение Ошибка и не полезно, поскольку это не дает много полезной информации. Я просто не могу понять, что мне не хватает.

+1

У меня была похожая ситуация. Этот вопрос, который я поставил перед собой, может помочь. http://stackoverflow.com/questions/34447124/using-google-cloud-storage-with-golang-on-appengine –

+0

Я видел это сообщение раньше, однако код с рабочим примером больше не доступен в github. –

ответ

0

У меня были проблемы с методом google.DefaultClient в прошлом. Вот более явная стратегия для настройки клиента объект хранения, который может быть полезна для Вас:

httpClient = &http.Client{ 
    Transport: &oauth2.Transport{ 
     Source: google.AppEngineTokenSource(ctx, scopes...), 
     Base: &urlfetch.Transport{Context: ctx}, 
    }, 
} 

service, err := storage.New(httpClient) 
if err != nil { 
    return nil, err 
} 

Однако, я не знаком с сообщением о forbiddenFinished ошибки, что может свидетельствовать о том, что проблема заключается в другом.

Кроме того, если у вас нет конкретной причины использовать автогенерированную библиотеку google.golang.org/api/storage/v1, я бы рекомендовал использовать интерфейс более высокого уровня, который можно найти по адресу cloud.google.com/go/storage. Вот идут док для него:

https://godoc.org/cloud.google.com/go/storage