Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 无法从本地应用引擎开发服务器访问BigQuery_Google App Engine_Google Oauth_Google Bigquery_Google Api Python Client - Fatal编程技术网

Google 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不适用于本地开发服务器

这是一个与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服务进行身份验证

我认为目前不可能使用
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)