Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.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/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
谷歌+;登录-服务器端流-存储凭据-Python示例_Python_Google App Engine_Session_Flask_Google Plus - Fatal编程技术网

谷歌+;登录-服务器端流-存储凭据-Python示例

谷歌+;登录-服务器端流-存储凭据-Python示例,python,google-app-engine,session,flask,google-plus,Python,Google App Engine,Session,Flask,Google Plus,我正在使用Flask在Google应用程序引擎上构建一个应用程序。我正在从Python示例中描述的服务器端流实现Google+登录:和 这两个例子都有: credentials = oauth_flow.step2_exchange(code) 及 将凭据对象存储到Flask会话。当我在我的Google App Engine项目上运行此代码时,我得到以下错误: TypeError: <oauth2client.client.OAuth2Credentials object at 0x7f

我正在使用Flask在Google应用程序引擎上构建一个应用程序。我正在从Python示例中描述的服务器端流实现Google+登录:和

这两个例子都有:

credentials = oauth_flow.step2_exchange(code)

将凭据对象存储到Flask会话。当我在我的Google App Engine项目上运行此代码时,我得到以下错误:

TypeError: <oauth2client.client.OAuth2Credentials object at 0x7f6c3c953610> is not JSON serializable
然而,在下列情况下:

切勿将凭据对象存储在cookie中,它包含应用程序
客户端id和客户端机密

也许我误解了Flask会话对象的工作原理,但是:

。。。会话基本上可以记住从一个请求到另一个请求的信息。Flask实现这一点的方法是使用签名cookie。因此,用户可以查看会话内容,但不能修改它,除非他们知道密钥

因此,我们不应该在会话中存储凭证对象,即使它是一个签名cookie

在我的例子中,我目前只需要为断开连接的目的重新使用访问令牌,所以我可以存储它

处理这种情况的正确方法是什么?凭据是否应该根本不存储在会话中?在示例中的这一点上是否应该有一条注释“在此处安全保存凭据”

“Flask默认使用Werkzeug提供的“安全cookie”作为会话系统。它通过对会话数据进行酸洗、压缩和base64编码来工作。”-

换句话说,烧瓶真的很奇怪。您在会话中输入的任何内容都将使用服务器密钥加密,发送到客户端并存储在客户端中。然后,服务器在每个后续请求中接收该密钥,并使用相同的密钥对其进行解码。这还意味着会话数据将在服务器重新启动后继续存在,因为它位于客户端

为了改进我的应用程序,我将flask SessionInterface与Couchdb一起使用,现在客户端只知道一个sessionID,该sessionID是根据存储实际数据的数据库进行检查的。万岁

看看这个,它有一些服务器端会话的方法,这取决于您可能使用的数据库-

Flask用于使用
pickle
而不是JSON来存储会话中的值,而Google示例代码就是基于这一点编写的。Flask切换到基于JSON的格式,以减少被披露的服务器端机密的影响(黑客可以使用
pickle
,而不是JSON劫持您的进程)

仅在会话中存储访问令牌:

session['credentials'] = credentials.access_token
您可以使用该令牌重新创建
凭证
对象,如果以后需要,可以使用:

credentials = AccessTokenCredentials(session['credentials'], 'user-agent-value')
AccessTokenCredentials
对象仅存储凭据;但是,由于它缺少客户端id和客户端机密,因此无法用于刷新令牌


用户代理的价值是你需要弥补的;如果您可以访问OAuth服务器日志,它可以帮助诊断问题;有了谷歌,我就不指望了,所以就在这里做点什么吧

这个问题有点离题,但主题是烧瓶、会话、OAuth。。您可以查看gae init项目,该项目具有以下所有功能:Flask从pickle切换到使用JSON进行会话(在您的密钥被泄露的情况下更安全)。Google starter Flask应用程序是在考虑pickle会话的情况下编写的。Flask并不像你想象的那么怪异。Django和Pyramid与其他系统使用类似的方法。然而,这不是问题的重点。Google sample Flask项目过去是有效的,但最近版本的Flask没有,OP需要一个解决方案。
session['credentials'] = credentials.access_token
credentials = AccessTokenCredentials(session['credentials'], 'user-agent-value')