使用API密钥从GAE访问具有Go的Bigquery的权限被拒绝

使用API密钥从GAE访问具有Go的Bigquery的权限被拒绝,go,google-api,google-bigquery,google-api-go-client,Go,Google Api,Google Bigquery,Google Api Go Client,我正试图通过在谷歌应用程序引擎上开发的应用程序访问Bigquery中存储的数据。但是,每次我提出请求时,都会收到错误“权限被拒绝” 我已经作为项目API团队的成员添加了该应用程序(我添加了地址@appspot.gserviceaccount.com),并且我正在通过包code.google.com/p/google-API-go-client/bigquery/v2访问bigquery 以下代码是如何将API键附加到每个查询: transport := KeyedTransport{Key: &

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

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

以下代码是如何将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()
我还确保API密钥与GoogleAPI控制台中生成的密钥匹配。它是由团队的另一名成员生成的,如果有帮助的话,它会被标记为“浏览器应用程序(带引用)的密钥”


鉴于这给我带来了很多麻烦,我会迁移到Oauth2,因为对于Go来说,这似乎是更好的文档,但我正在考虑与一些不希望用户使用谷歌登录的组织合作。

我不是Go专家,但看起来您还需要授权应用程序通过使用服务帐户的OAuth 2.0流访问BigQueryAPI。应用程序引擎的Python和Java运行时使用类支持“应用程序引擎服务帐户”

但是,也可以启用服务器到服务器


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

JWT最终成为了一种方式,因为Go中没有AppAssertionCredentials等价物(目前还没有)。我正在使用这个jwt包的一个修改版本,它正在等待批准,以便包含在GoOAuth库中。
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))

}