Flask会话使用泡菜存储OAuth1Session

时间:2019-07-16 14:37:51

标签: python flask oauth pickle

我正在研究oauth1授权,目前正在将序列化的OAuth1Session对象存储在cookie中,该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的大小并避免重新创建或重新加载对象。

1 个答案:

答案 0 :(得分:0)

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

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

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