【问题标题】:Flask session storing OAuth1Session using pickle使用pickle存储OAuth1Session的Flask会话
【发布时间】:2019-07-16 14:37:51
【问题描述】:

我正在处理 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')

然后根据请求,我使用 inSession 装饰器检查 serializedSession 是否在 session 中,并在每次发送请求时加载对象:

@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 大小并避免重新创建或重新加载对象。

【问题讨论】:

    标签: python flask oauth pickle


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-01
      • 2019-03-11
      • 2017-01-10
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      相关资源
      最近更新 更多