Google BigQuery 的 Google App Engine 授权

Posted

技术标签:

【中文标题】Google BigQuery 的 Google App Engine 授权【英文标题】:Google App Engine authorization for Google BigQuery 【发布时间】:2013-07-06 06:17:04 【问题描述】:

我已按照 https://developers.google.com/bigquery/authorization#service-accounts-appengine 进行一些从应用引擎到 bigquery 的查询。

在第 2 步中,我点击 Google Api 控制台中的团队,它会重定向到 App Engine > Administration > Permissions。我将服务帐户名称添加为电子邮件并选择开发人员作为角色(“可以编辑”选项不可用),然后单击“邀请用户”。之后,出现一条消息:“一封电子邮件已发送至 xxxxxx@appspot.gserviceaccount.com 进行验证。”状态为待处理。我如何确认电子邮件?,这里似乎有一个错误......

接下来,我用下面的代码做了一个测试:

#!/usr/bin/env python
import httplib2
import webapp2
from google.appengine.api import memcache
from apiclient.discovery import build
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from oauth2client.appengine import AppAssertionCredentials 

# BigQuery API Settings
PROJECT_NUMBER        = 'XXXXXXXX' 

credentials = AppAssertionCredentials(scope='https://www.googleapis.com/auth/bigquery')
http        = credentials.authorize(httplib2.Http(memcache))
service     = build("bigquery", "v2", http=http)

class MainHandler(webapp2.RequestHandler):
    def get(self):
        query     = 'query':'SELECT word,count(word) AS count FROM publicdata:samples.shakespeare GROUP BY word;',
                     'timeoutMs':10000
        jobRunner = service.jobs()
        reply     = jobRunner.query(projectId=PROJECT_NUMBER,body=query).execute()
        self.response.out.write(reply)

app = webapp2.WSGIApplication([
    ('/', MainHandler)
], debug=True)

回复是(从谷歌运行):

HttpError: <HttpError 403 when requesting https://www.googleapis.com/bigquery/v2/projects/XXXXXXXX/queries?alt=json returned "Access Denied: Job YYYYYYYY:job_e57bdde0144c495dbc864ccbfb82b704: RUN_QUERY_JOB">

如果我从 localhost 测试,答案是:

HttpError: <HttpError 401 when requesting https://www.googleapis.com/bigquery/v2/projects/XXXXXXXX/queries?alt=json returned "Invalid Credentials">

有人可以帮助我吗? :-)

【问题讨论】:

这段代码对我来说完美无缺(当我用 BigQuery 项目 ID 替换 'XXX..' 时,在我的例子中是一个字符串),所以这是一个身份验证问题。顺便说一句,AppAssertionCredentials 在本地主机上不起作用。您是否在 code.google.com/apis/console/#project:ZZZ:services 上启用了 BigQuery API(以 ZZZ 作为您的 API 项目编号)? 如果在 App Engine 中,请检查 appengine.google.com/…。查看“Google API 控制台项目编号:”下的链接?点击它,并确保该项目启用了 BigQuery API。 【参考方案1】:

实际上,您可以从两个区域添加帐户。如果您使用旧的控制台 code.google.com/api/console,它会将您带到您的 appengine.google.com 仪表板,即“Way-1”,它实际上有一些询问“验证”的问题。新的https://cloud.google.com/console 解决了这个问题。

[Way-1] *有问题*点击http://appengine.google.com==> your_app_name > ==> 权限

[Way-2] *Works* 点击http://cloud.google.com/console ==> 点击your_app_name ==> 点击 左窗格上的权限==>单击添加成员按钮并添加,即具有“可以编辑”权限的 xxxxxx@appspot.gserviceaccount.com

“如果您已经通过 Way-1 添加您的帐户,请按照以下方法”

“Way-1”似乎有一些问题,因此您的帐户将一直显示“待定状态”。如果您以某种方式通过 Way-1 添加了帐户并在之后尝试关注“Way-2”,您将继续在 way-2 链接上看到相同的状态。为此,您必须使用鼠标悬停时出现的“删除图标”删除该用户。从那里删除帐户并添加具有 “可以编辑” 权限的 xxxxxx@appspot.gserviceaccount.com。

【讨论】:

【参考方案2】:

您可以将 xxxxxx@appspot.gserviceaccount.com 添加到 http://cloud.google.com/console 的项目中。

预计这很快就会变得更容易/更直接!


一步一步,@Christian:

    转到应用程序的 App Engine 仪表板,点击应用程序设置并复制服务帐户名称 (xxxxxx@appspot.gserviceaccount.com) 转到http://cloud.google.com/console 选择您的项目 点击齿轮图标并选择团队 点击添加成员 粘贴服务帐户名称并选择可以编辑权限,然后单击添加。 玩得开心!

【讨论】:

以上是关于Google BigQuery 的 Google App Engine 授权的主要内容,如果未能解决你的问题,请参考以下文章

com.google.cloud.bigquery.BigQueryException:读取超时

在 Google Apps 脚本中使用 BigQuery 连接到 Google 电子表格

使用命令行将数据从 BigQuery 加载到 Google 表格中

Google BigQuery - 将数据流式传输到 BigQuery

使用 Google.Cloud.BigQuery.V2 的 BigQuery 加载作业的幂等性

从 google.cloud 导入 bigquery ModuleNotFoundError:没有名为“google”的模块