我正在尝试通过我在 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 的组织合作。