【问题标题】:Django APIView to log out of a user sessionDjango APIView 注销用户会话
【发布时间】:2023-03-27 23:39:01
【问题描述】:

我有一个从 SSO 服务调用的 Django 模块。该服务有一个单一的登出功能,它会在登录期间向给它的 URL 发出一个 GET 请求。

我正在尝试在 Django 中设置 APIView 来处理此注销。源服务从不检查响应;它只调用一次GET URL。

我正在为APIView 尝试类似的操作,但不断收到session.DoesNotExist 异常:

class LogoutApi(APIView):

    def get(self, request, *args, **kwargs):
        s = Session.objects.get(session_key=kwargs.get('sk', ''))
        s.delete()
        return Response({'result': True})

我知道我有一个有效的会话,但即使我尝试遍历 Session.objects 也找不到它。

我还尝试从SessionStore 中拔出钥匙:

class LogoutApi(APIView):

    def get(self, request, *args, **kwargs):
        sk = request.GET.get('sk', '')
        try:
            s = SessionStore(sk)
            del s[sk]
            return Response({'result': True})
        except:
            self.logger.error(sys.exc_info()[0])
        return Response({'result': False})

还是没有成功。有没有办法可以设置GET API 调用来终止特定会话?

【问题讨论】:

  • MIDDLEWARE 设置中的会话中间件是否处于活动状态?还是您在登录时以某种方式创建会话?
  • 我的中间件列表中确实有 django.contrib.sessions.middleware.SessionMiddleware 处于活动状态。
  • 这很奇怪,如果您在登录时有中间件,则应该创建一个 Session 对象。尝试调试会话中间件代码,看看使用什么键来创建会话。
  • 你确定你有一个会话吗?通过 API 端点登录时不会创建会话。基于令牌的身份验证是无状态的。例如,当您使用浏览器登录 API 时,会使用基于会话的身份验证。你是怎么登录的?
  • 用户通过SSO站点登录。然后他们打开一个使用 OAuth 登录 Django 站点的页面。我在登录时将一堆值存储到用户会话self.request.session['user_name'] = request.GET.get('user_name', None) 中。这就是我要清除的会话数据。

标签: python django session django-rest-framework


【解决方案1】:

原来问题在于会话引擎被设置为使用签名的 cookie。从我的配置中删除以下行后,一切都按预期工作:

SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies" # Removed this line

作为参考,这是与上述设置一起使用的注销代码:

class LogoutApi(APIView):

    def get(self, request, *args, **kwargs):

        sk = request.GET.get('sk', '')
        if sk:
            s = SessionStore(session_key=sk)
            s.delete()
            return Response({'result': True})
        return Response({'result': False})

【讨论】:

    猜你喜欢
    • 2020-02-05
    • 2011-06-26
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 2019-07-09
    • 2012-05-11
    • 2019-10-11
    相关资源
    最近更新 更多