使用django-social-auth强制浏览器关闭会话到期

时间:2013-01-05 08:34:14

标签: django session-timeout django-sessions

当我使用FB / Google登录我网站的用户关闭浏览器时,我正在寻找一种强制重新登录的方法。我正在阅读https://django-social-auth.readthedocs.org/en/latest/configuration.html,我不认为:

SOCIAL_AUTH_EXPIRATION = 'expires' 

SOCIAL_AUTH_SESSION_EXPIRATION = True

真正做我想要的。我尝试以这种方式添加自定义管道,将到期时间设置为0作为管道中的最后一件事:

def expire_session_on_browser_close(backend, details, response, social_user, uid, user, request, *args, **kwargs):
    request.session.set_expiry(0)

SOCIAL_AUTH_PIPELINE = (
    'social_auth.backends.pipeline.social.social_auth_user',
    #'social_auth.backends.pipeline.associate.associate_by_email',
    'social_auth.backends.pipeline.user.get_username',
    'social_auth.backends.pipeline.user.create_user',
    'social_auth.backends.pipeline.social.associate_user',
    'social_auth.backends.pipeline.social.load_extra_data',
    'social_auth.backends.pipeline.user.update_user_details',
    'useraccount.pipeline.expire_session_on_browser_close',
)

但它似乎没有生效。设置

SESSION_EXPIRE_AT_BROWSER_CLOSE = True 

也没有效果。

在类似的说明中,我的网站还允许用户“传统”登录,我可以

request.session.set_expiry(0)

在那里做技巧,用户在关闭浏览器时被迫登录。只是不适用于FB / Google登录。

有什么想法吗?

谢谢!

修改

如果我去捣乱:

UserSocialAuthMixin::expiration_datetime() 

db\base.py

并强制它返回0,我的问题得到解决。

但这是糟糕的,糟糕的hackery。有更好,更优雅的方式吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

哦,伙计,我过度设计到了N度。我需要做的就是设置:

SOCIAL_AUTH_SESSION_EXPIRATION=False

这样,如果提供者的响应包含'expires'或SOCIAL_AUTH_EXPIRATION包含的任何内容,则django-social-auth不会对该解析的值调用set_expiry()。

此外,我还设置了管道功能(如我原来的问题所示),以便我可以设置自己的到期时间(在我的情况下为0)。