python - 使用pickle存储OAuth1Session的Flask会话
问题描述
我正在处理 oauth1 授权,目前我正在将一个序列化OAuth1Session
对象存储在一个看起来很昂贵的 cookie 中(对象的大小为 2.6kb)。
据我了解,最好保留对访问服务很重要的信息,即访问令牌。因此,我正在考虑两种方法。
oauthSession = OAuth1Session(
client_key=CLIENT_KEY,
client_secret=CLIENT_SECRET,
resource_owner_key=oauthAccessTokens.get('oauth_token'),
resource_owner_secret=oauthAccessTokens.get('oauth_token_secret'))
session['serializedSession'] = pickle.dumps(oauthSession)
session['oauthToken'] = oauthAccessTokens.get('oauth_token')
session['oauthTokenSecret'] = oauthAccessTokens.get('oauth_token_secret')
然后根据请求,我检查是否serializedSession
在session
装饰器中inSession
,并在每次发送请求时加载对象:
@inSession
def get(serviceRequestURL):
oauthSession = pickle.loads(session['serializedSession'])
return processResponse(oauthSession.get(serviceRequestURL))
另一种方法是存储两个访问令牌并OAuth1Session
在请求上创建一个新对象并检查这两个令牌是否存在于会话中:
@inSession
def get(serviceRequestURL):
oauthSession = oauthSession = OAuth1Session(
client_key=CLIENT_KEY,
client_secret=CLIENT_SECRET,
resource_owner_key=session['oauthToken'],
resource_owner_secret=session['oauthTokenSecret'])
return processResponse(oauthSession.get(serviceRequestURL))
这似乎是微小的改进,但我不确定哪种方法最好,或者是否有更好的方法。重新创建或重新加载对象的整个想法似乎不是一个好的解决方案,因此我正在寻找一种更好的方法来减少 cookie 大小并避免重新创建或重新加载对象。
解决方案
您应该使用第二种方式。为什么要在会话中保存 OAuth1Session 实例?如果你想重用你的 OAuth1Session 实例,你可以在你的函数之外声明它。
我建议你使用像https://docs.authlib.org/en/latest/client/flask.html这样的烧瓶集成,这样你就不必处理这样的事情了。
更重要的问题是你不应该将 oauth 令牌存储到会话中,因为 Flask 会话是签名的 cookie,oauth 令牌将暴露给客户端(浏览器)。
推荐阅读
- android - 如何从 Firebase 中提取数据作为 Dart 中的字符串?
- javascript - 使用 React.render 的客户端渲染省略了图像标签的 onerror 属性
- blockchain - 非货币数据的区块链挖掘
- vb.net - VB.NET中的沙漏光标
- c++ - 用于线程间通信的 Windows 套接字
- php - 请有人在sql注入时解释这一步
- warnings - 如何避免此 WARN service=EJB3 未配置,使用传统解析?JBoss5.2
- android - 检查所有不可见的按钮行和列Android
- java - 定期检查数据库
- python - 适用于 Python 的 Visual Studio Code 调试器