Google app engine 无法从本地应用引擎开发服务器访问BigQuery
这是一个与python Google AppEngine应用程序和Google的BigQuery之间的服务器到服务器授权相关的问题,但可能与其他云服务相关 tldr;是否可以让App Engine本地开发服务器使用远程BigQuery服务进行身份验证?更好的是,是否有本地BigQuery? 我知道AppAssertionCredentials目前在本地开发服务器上不起作用,尽管这本身非常令人沮丧 在本地开发服务器沙箱之外,适用于标准python代码的替代方法detailed不适用于本地开发服务器,因为即使启用PyCrypto,沙箱也不允许某些posix模块,例如“pwd” 我在远程服务器上使用了AppAssertionCredentials,在本地python中使用了SignedJwtAssertionCredentials方法,因此服务帐户设置正确 在try/except块中的oauth2client/crypt.py中导入失败-在注释掉它们之后,很容易看到沙盒白名单异常 我在白名单上添加了“pwd”,然后又出现了另一个问题,所以我赶紧从兔子洞里跑了出来 我已经尝试将PyCrypto直接包含到项目中,并获得了类似的结果 我也尝试过使用OpenSSL,结果类似 我找了一个本地的appengine专用PyCrypto,但没有找到,是不是错过了一个?我应该说这是在MacOSX上的——也许我应该启动一个linux机器并试一试 是否可以让App Engine本地开发服务器使用远程BigQuery服务进行身份验证 我认为目前不可能使用Google app engine 无法从本地应用引擎开发服务器访问BigQuery,google-app-engine,google-oauth,google-bigquery,google-api-python-client,Google App Engine,Google Oauth,Google Bigquery,Google Api Python Client,这是一个与python Google AppEngine应用程序和Google的BigQuery之间的服务器到服务器授权相关的问题,但可能与其他云服务相关 tldr;是否可以让App Engine本地开发服务器使用远程BigQuery服务进行身份验证?更好的是,是否有本地BigQuery? 我知道AppAssertionCredentials目前在本地开发服务器上不起作用,尽管这本身非常令人沮丧 在本地开发服务器沙箱之外,适用于标准python代码的替代方法detailed不适用于本地开发服务器
AppAssertionCredentials
作为BigQuery服务和本地App Engine服务器之间的身份验证方法
或者,我使用与特定用户(该用户必须在您的项目中注册于)关联的OAuth2身份验证从本地AppEngine服务器访问BigQuery
为了获得用户OAuth2身份验证,我在应用程序代码中使用了oauth2client.client
模块
我希望这将有助于解决你的问题
更新:
这就是我为获得用户OAuth2授权所做的
编辑:
添加了缺少的导入语句。
谢谢mattes
import os
import webapp2
import httplib2
from oauth2client.client import OAuth2Credentials
from oauth2client.appengine import StorageByKeyName, CredentialsModel, OAuth2DecoratorFromClientSecrets
from google.appengine.api import users
oauth2_decorator = OAuth2DecoratorFromClientSecrets(
os.path.join(os.path.dirname(__file__), 'client_secrets.json'),
scope='https://www.googleapis.com/auth/bigquery')
oauth2_decorator._kwargs = {'approval_prompt': 'force'}
class TestPage(webapp2.RequestHandler):
@oauth2_decorator.oauth_required
def get(self):
user_id = users.get_current_user().user_id()
credentials = StorageByKeyName(CredentialsModel, user_id, 'credentials').locked_get()
http = credentials.authorize(httplib2.Http()) # now you can use this http object to access BigQuery service
application = webapp2.WSGIApplication([
('/', TestPage),
(oauth2_decorator.callback_path, oauth2_decorator.callback_handler()),
], debug=True)
因此,深入搜索PyCrypto和本地appengine沙盒将引导我进入这个线程,并做出明确的响应 这在1.7.4中已固定。但是,您必须使用easy_install-Z (-始终解压缩)以安装PyCrypto。中的默认zipfile选项 OSX 10.8与中的沙箱模拟不兼容 dev_appserver 结果证明,解决方案非常直截了当 我用过:
sudo easy_install pycrypto
应该是:
sudo easy_install -Z pycrypto
按照上面的思路。使用PIP也可以:
pip install pycrypto
或者手动下载并安装pycrypto也可以。我测试了所有三个
如果您安装了带有easy_install且不带-Z标志的pycrypto,那么您可能需要安装pip,以便轻松卸载pycrypto
easy_install pip
作为记录,我创建并安装了libgmp,因为pil和手动安装显示了这个警告
警告:未找到GMP或MPIR库;不建
加密公钥
虽然这给了我fastmath,但解决这个问题并不是必要的,因为Crypto libs很自然地无法慢行
另一个让我有点困惑的地方是,我在测试OpenSSL是否能满足我的所有需求时,从app.yaml中删除了pycrypto
所以别忘了加上
- name: pycrypto
version: latest
进入库:
部分下的app.yaml
由于缺少此项,未导入本机计数器库,因此计数器失败等
此外,任何关于必须将Crypto移动到应用程序文件夹中或从默认Mac OS X位置/Library/Python/2.7/site-packages/Crypto移出的说法都只在早期版本的开发服务器中有效
类似地,现在不需要编辑任何_WHITE_LIST_C_MODULES LIST(在appengine 1.8以后的版本中位于sandbox.py中,它还包括允许Crypto.Util._计数器等的正则表达式)
如果你在发现密钥问题之前遇到了另一个难题,那就是你从控制台下载的密钥文件是PKCS12,并且是作为十六进制文本下载的,所以我将其转换为二进制,然后将其转换为PEM,这样我就可以将其包含在源代码中 我同意第一篇文章-本地主机/生产阻抗在a**中是一个真正的难题。AppAssertionCredentials是进行生产的正确方式,我不希望在生产和本地主机之间有两种不同的代码路径。因此,需要调整开发环境,以便能够在不影响主代码路径的情况下执行所需的身份验证 例如,也许开发人员可以使用appcfg.py使用自己的Google帐户登录,然后该身份验证将被缓存一段时间,这样AppAssertionCredentials就可以工作了。开发者的Google帐户可以被授予相应环境的权限(例如,为我们开发和测试)
re:“local BigQuery”-我们已经准备好了一些初始的东西,使用SQLLite来模拟单元测试和其他离线/本地测试的BigQuery交互,但当然,这不是一个很好的模拟。我同意,所有云平台产品都需要花和App Engine一样多的时间思考开发时间体验。我为此挣扎了一两天。我终于能够让localhost使用服务器到服务器身份验证、服务帐户和.p12证书
如果这对任何人都有帮助的话,这里有一个简单的要点:谷歌应用程序引擎的最新版本
$ dev_appserver.py --help
...
Application Identity:
--appidentity_email_address APPIDENTITY_EMAIL_ADDRESS
email address associated with a service account that
has a downloadable key. May be None for no local
application identity. (default: None)
--appidentity_private_key_path APPIDENTITY_PRIVATE_KEY_PATH
path to private key file associated with service
account (.pem format). Must be set if
appidentity_email_address is set. (default: None)