1

我正在尝试通过我在 Google App Engine 上开发的应用程序访问存储在 Bigquery 中的数据。但是,每次我提出请求时,我都会收到错误“权限被拒绝”。

我已将该应用程序添加为该项目的 API 团队成员(我添加了地址 @appspot.gserviceaccount.com),并且我正在通过包 code.google.com/p/google-api-go-client 访问 bigquery /bigquery/v2

以下代码是我如何将 API 密钥附加到每个查询:

transport := KeyedTransport{Key: <api key>, Transport: http.DefaultTransport}
client := &http.Client{Transport: transport}
err := errors.New("reached")
b, err := bigquery.New(client)

...
query := &bigquery.QueryRequest{
            DefaultDataset: <perviously defined daset> 
            Query: <query that looks in a single table for a single result by a unique id>,
            Kind: "json",
            MaxResults: 1,


...

b.Jobs.Query(ProjectID, query).Do()

并且为 KeyedTransport 定义了以下内容

func (t KeyedTransport)  RoundTrip(req *http.Request) (*http.Response, error){
        u := *req.URL
        args := u.Query()
        args.Set("key", t.Key)
        u.RawQuery = args.Encode()

        r, err := http.NewRequest(req.Method, u.String(), newBody)

        resp, err := t.Transport.RoundTrip(r)
        if err != nil{
                return nil, errors.New("error: "+err.Error())
        }
        return nil, errors.New("resp: "+toJson(resp))

}

我还确保 API 密钥与 Google API 控制台中生成的密钥相匹配。它是由团队的另一名成员生成的,如果有帮助,它会被标记为“浏览器应用程序的密钥(带有引用者)”。

鉴于这给我带来了很多麻烦,我会转向 Oauth2,因为这似乎对 Go 有更好的记录,但我正在考虑与一些不希望要求用户登录 Google 的组织合作。

4

1 回答 1

0

我不是 Go 专家,但您似乎还需要授权您的应用程序通过使用服务帐户的 OAuth 2.0 流访问 BigQuery API。App Engine 的 Python 和 Java 运行时使用AppAssertionCredentials类支持“App Engine 服务帐户” 。

但是,也可以使用通过 Google 开发人员控制台生成的 JWT 文件启用服务器到服务器。

可以通过可以处理 JWT 文件的 go-lang 库使用服务器到服务器 OAuth 授权从 GAE Go 运行时访问 BigQuery(可能像这样)。

于 2012-07-23T01:55:06.380 回答