python - Google+ 登录 - 服务器端流程 - 存储凭据 - Python 示例

标签 python google-app-engine session flask google-plus

我正在使用 Flask 在 Google App Engine 上构建一个应用程序。我正在从 Python 示例中描述的服务器端流程实现 Google+ 登录:https://developers.google.com/+/web/signin/server-side-flowhttps://github.com/googleplus/gplus-quickstart-python/blob/master/signin.py .

两个例子都有:

credentials = oauth_flow.step2_exchange(code)

session['credentials'] = credentials

将凭据对象存储到 Flask session 中。当我在我的 Google App Engine 项目上运行此代码时,出现错误:

TypeError: <oauth2client.client.OAuth2Credentials object at 0x7f6c3c953610> is not JSON serializable

this issue 中所述(标记为 WontFix),OAuth2Credentials 未设计为可由 JSON 序列化。它有方法 to_jsonfrom_json ,可以用来存储它,例如:

session['credentials'] = credentials.to_json()

但是,在 same issue :

Never store a Credentials object in a cookie, it contains the applications
client id and client secret.

也许我误解了 Flask session 对象的工作原理,但来自 the doc :

... A session basically makes it possible to remember information from one request to another. The way Flask does this is by using a signed cookie. So the user can look at the session contents, but not modify it unless they know the secret key...

因此,我们不应在 session 中存储凭据对象,即使它是已签名的 cookie。

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

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

最佳答案

Flask 过去使用 pickle 而不是 JSON 来存储 session 中的值,Google 示例代码在编写时就考虑到了这一点。 Flask 切换到基于 JSON 的格式以减少服务器端 secret 泄露的影响(黑客可以使用 pickle 而不是 JSON 劫持您的进程)。

在您的 session 中存储访问 token :

session['credentials'] = credentials.access_token

您可以使用该 token 重新创建 credentials 对象,使用 AccessTokenCredentials class稍后,如果您再次需要它:

credentials = AccessTokenCredentials(session['credentials'], 'user-agent-value')

AccessTokenCredentials 对象存储只是凭证;但是,因为它缺少客户端 ID 和客户端密码,所以它不能用于刷新 token 。

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

关于python - Google+ 登录 - 服务器端流程 - 存储凭据 - Python 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22915461/

相关文章:

python - 使用高斯核密度 (Python) 计算值与平均值的差异

python - 在Python中执行带空格的Windows路径

python - 如何在pygame中按下按键后更改屏幕上的 Sprite

google-app-engine - 谷歌应用引擎 (GAE) 上的 Lucene

node.js - 尽管用户在网站上注销,但 Socket.io 授权仍然存在

asp.net - 如何验证我的 ASP.NET session 数据是否可以正确序列化?

python - pickle 类定义

python - Tipfy: 如何在模板中显示 blob?

java - 阻止 servlet 访问 Jetty 中的文件系统或其他 Java 核心库(如 Google App Engine)?

asp.net - SessionState 过期行为