首页 > 解决方案 > 使用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')

然后根据请求,我检查是否serializedSessionsession装饰器中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 大小并避免重新创建或重新加载对象。

标签: pythonflaskoauthpickle

解决方案


您应该使用第二种方式。为什么要在会话中保存 OAuth1Session 实例?如果你想重用你的 OAuth1Session 实例,你可以在你的函数之外声明它。

我建议你使用像https://docs.authlib.org/en/latest/client/flask.html这样的烧瓶集成,这样你就不必处理这样的事情了。

更重要的问题是你不应该将 oauth 令牌存储到会话中,因为 Flask 会话是签名的 cookie,oauth 令牌将暴露给客户端(浏览器)。


推荐阅读