【问题标题】:Use Google Cloud Storage API with Go AppEngine将 Google Cloud Storage API 与 Go AppEngine 结合使用
【发布时间】:2016-10-08 05:45:06
【问题描述】:

我编写了一个测试代码,通过 Cloud Storage API 列出来自 Google Cloud Storage 的存储桶,但是当我运行代码时出现以下错误:

googleapi: Error 403: Forbidden, forbiddenFinished

我已经检查了权限,并且 appengine 服务帐户可以访问存储桶,并且 appengine 应用程序和云存储存储桶都在同一个项目中。

这是我的示例代码:

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

错误消息也没有帮助,因为它没有提供太多有用的信息。我就是想不通我错过了什么。

【问题讨论】:

  • 我也有类似的情况。我之前提出的这个问题可能会有所帮助。 stackoverflow.com/questions/34447124/…
  • 我以前看过这篇文章,但是 github 上不再提供包含工作示例的代码。

标签: google-app-engine go google-cloud-storage


【解决方案1】:

过去我在使用 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 找到。这是它的 go 文档:

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

【讨论】:

    猜你喜欢
    • 2016-03-30
    • 2014-08-26
    • 2013-11-29
    • 2014-11-05
    • 2021-02-21
    • 2015-06-15
    • 2015-06-13
    • 2018-12-09
    • 2016-10-06
    相关资源
    最近更新 更多