关于Bigquery授权/最佳实践用于公共访问的基本问题

时间:2015-03-22 20:50:53

标签: javascript google-app-engine google-api google-bigquery google-authentication

我一直在阅读Google API文档以及StackOverflow,但无法找到有关Bigquery基础知识的一些答案,例如Web应用程序的预期用法/最佳做法/透明授权。

我正在开发基于网络的GIS平台,该平台托管在Google VM实例上。我使用Geoserver根据javascript查询将几何图形发送到我的网页。我再次使用Bigquery来提供人口普查数据以匹配该几何,同样基于javascript查询。我之所以选择Bigquery,是因为我上传了2011年的加拿大人口普查局,其中有数千个专栏......所有这些都是我想让最终用户使用的。

现在,只要我通过自己的Google帐户登录,一切都按照我希望的方式运作。 Bigquery访问似乎只适用于允许显式访问我的Google Cloud项目的用户。我想做以下其中一项:

1)使用javascript和php在我的网络服务器和bigquery api之间进行服务器到服务器身份验证。我发现了Java和Python的例子,但我不熟悉这些语言,并且非常喜欢坚持使用javascript / php。我意识到基于浏览器的javascript不能用于传输客户端机密,但有一个简单的PHP脚本,我可以发送我的查询,让它访问client_secrets.json文件,处理我的查询,并发送回请求的初始网页数据?我强烈希望工作流程是[Javascript向PHP文件发送请求] - > [PHP文件使用client_secrets文件处理请求] - > [PHP文件发送回查询结果]。

2)指导访问者如何创建免费的Google项目,启用Bigquery API,在Bigquery控制台中添加人口普查数据集(我已向所有经过身份验证的用户提供),然后提供我的网页与他们的项目和clientid。当他们然后启动查询时,我的应用程序中的javascript将用户的projectid和clientid插入到Bigquery查询中,确保客户端负责他们的查询配额而不是我的服务。我自己尝试过,但似乎无法让它发挥作用。我得到一个关于javascript起源的错误,但我不确定如何解决这个问题。

如果您能为我提供以下答案,我将非常感激:

1)这些提议的工作流程中是否存在重大缺陷?

2)对于包含数千列的数据库,Bigquery是否有替代方案?

3)在任何一个提议的工作流程中,包含缓存的最佳方法是什么?

对不起,如果这些是基本问题,但我已经做了很多搜索和阅读。我是一名社会学研究生,所以我的编码能力非常基础,并且基于在线教程,所以如果你能详细说明你的答案,我将不胜感激。这些都是免费使用的公共数据项目,所以您的时间将用于向公众提供信息。

谢谢。

****跟进**** 我结合使用保罗和奔腾发布的建议。我要求用户创建一个新的开发人员帐户,并为他们创建一个表单,以便将他们的BigQuery API密钥发布到。一旦他们这样做,我只是授权使用他们的API密钥,他们收到了Google Auth通知,如果他们接受了,就可以访问该服务。当然不理想,但它只是一个概念的证明,并完成了工作。谢谢大家。

2 个答案:

答案 0 :(得分:2)

第一个工作流程有效,我们使用相同的方法,前端 - > PHP - > BQ。

您需要创建service account credentials,并且只需要授权一次。

您可以搜索my activity under bigquery标记,您也会找到一些PHP示例。

答案 1 :(得分:1)

对于选项1,请注意您无需创建服务帐户凭据 - 因为您提到您在Google Compute Engine(GCE)上运行。

如果您使用BigQuery权限启动GCE实例,那么此代码将为您提供所需的凭据(Python示例):

from oauth2client import gce
from bigquery_client import BigqueryClient
from pandas.io import gbq

credentials = gce.AppAssertionCredentials(scope='https://www.googleapis.com/auth/bigquery')
client = BigqueryClient(credentials=credentials,
                        api='https://www.googleapis.com',
                        api_version='v2',
                        project_id='project-id')