2016-10-08 1 views
0

J'ai écrit un code d'essai à la liste des seaux de Google Cloud Storage via l'API Cloud Storage, mais je reçois l'erreur ci-dessous lorsque je lance le code:utiliser l'API de stockage Google Cloud avec Go AppEngine

googleapi: Error 403: Forbidden, forbiddenFinished 

J'ai vérifié les autorisations et le compte de service appengine a accès aux compartiments et l'application appengine et le compartiment de stockage en nuage sont sur le même projet.

Ceci est mon exemple de code:

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.") 

} 

Et voici le fichier YAML:

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

handlers: 

- url:/
    script: _go_app 

Le message d'erreur est ni utile car elle ne fournit pas beaucoup d'informations utiles. Je ne peux pas comprendre ce qui me manque.

+1

J'ai eu une situation similaire. Ce questionnement que j'ai posé avant peut aider. http://stackoverflow.com/questions/34447124/using-google-cloud-storage-with-golang-on-appengine –

+0

J'ai déjà vu ce post, mais le code avec l'exemple de travail n'est plus disponible sur github. –

Répondre

0

J'ai eu des problèmes avec la méthode google.DefaultClient dans le passé. Voici une stratégie plus explicite pour configurer l'objet client de stockage qui pourrait être utile pour vous:

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 
} 

Cependant, je ne suis pas familier avec le message d'erreur forbiddenFinished, ce qui pourrait indiquer que la question est ailleurs.

En outre, si vous n'avez pas de raison particulière d'utiliser la bibliothèque google.golang.org/api/storage/v1 générée automatiquement, je vous recommande d'utiliser l'interface de niveau supérieur, qui peut être trouvée à cloud.google.com/go/storage. Voici la doc allez-y:

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