移动应用程序上的 Django session

标签 django session

我们目前正在为我们使用 Django 构建的网站开发一个移动应用程序(使用 ionic)。每次用户登录时,我们都会在站点上使用 django session 。据我了解,django session 在客户端设置 session ID,该 ID 存储在浏览器的 cookie 中。如果移动应用程序与 django 分开,我们如何在移动应用程序中设置此 session ID?

最佳答案

我认为您至少可以通过三种方式来解决这个问题:

  • 找到一种方法让您的 ionic 应用程序使用 django 的 cookie( session 和 CSRF)。
  • 以三种方式更改您的 django 应用程序:1) 具有登录/注销 View ,为移动应用程序提供身份验证 token ,2) 扩展 SessionMiddleware 以从通过移动应用程序的“授权”HTTP header 发送的身份验证 token 中提取 session ID请求,3) 扩展 django 的 CSRF 中间件,以发出非来自 Web 浏览器的请求,免除 CSRF 检查。
  • 尝试使用现有的解决方案将 JWT(Json Web token )身份验证添加到 Django。

  • 让基于 WebView 的混合移动应用程序在 android 和 ios 上都与 cookie 一起正常工作似乎并非易事(例如 Handling cookies in PhoneGap/Cordova )。

    到目前为止,我发现的 JWT-auth 的现有解决方案似乎没有使用 Django 的 session (我觉得这很方便,因为它有一个统一的解决方案来杀死手机/计算机被盗或帐户被黑的用户的 session )。如果有人知道在 Django 的常规 session 之上进行 token 验证的可插拔解决方案,请发表评论。

    详细说明方法2:
  • 当您的移动应用程序不处理 cookie 时,由于 Django 的 CSRF 检查,它甚至无法登录。这就是为什么来自您的移动应用程序的请求需要不受 CSRF 保护的原因。

  • 注意:做 不是 只需禁用 CSRF 保护。虽然移动应用程序不易受到 CSRF 攻击,但访问现有网站的人的浏览器仍然存在。
  • 要扩展 CSRF 机制以排除非浏览器请求,您需要一种有效的方法来确定请求是否来自 Web 浏览器。我们可以查看一堆 HTTP header (例如,Referer、Cookie、X-Requested-With、Origin)以获取想法。现在让我们假设您的合法网站用户不会欺骗他们的标题。
  • 使用与 CSRF-exemption 相同的“is-web-browser”-check 来保护移动应用程序的登录/注销 View 。

  • 示例代码(对于 Android 移动应用程序,来自移动应用程序的 iOS header 可能不同):
    def is_mobile_app_access(request):
        return request.META.get('HTTP_REFERER', None) is None 
            and request.META.get('HTTP_COOKIE', None) is None 
            and request.META.get('HTTP_X_REQUESTED_WITH', None) == 'your.app.name.here' 
            and request.META.get('HTTP_ORIGIN', None) == 'file://'
    
    class CustomCsrfViewMiddleware(CsrfViewMiddleware):
        def process_view(self, request, callback, callback_args, callback_kwargs):
            if is_mobile_app_access(request):
                return None
            else:
                return super(CustomCsrfViewMiddleware, self).process_view(request, callback, callback_args, callback_kwargs)
    
        def process_response(self, request, response):
            if is_mobile_app_access(request):
                return response
            else:
                return super(CustomCsrfViewMiddleware, self).process_response(request, response)
    
    
    class CustomSessionMiddleware(SessionMiddleware):
        def process_request(self, request):
            if is_mobile_app_access(request):
                session_key = request.META.get("HTTP_AUTHORIZATION", None)
            else:
                session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
            request.session = self.SessionStore(session_key)
    

    如果有人发现这种方法存在根本性的错误,请告诉我。我认为这种方法中最薄弱的环节是 is_mobile_app_access 的可靠性如何。检查是。

    你最后做了什么?

    关于移动应用程序上的 Django session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37316140/

    相关文章:

    django - 如何让自定义分页类适用于 django Rest Framework v3.6

    ios - 如何在 Swift 3 的 UIWebview 中 session 过期?

    postgresql - 使用黑名单撤销 JWT session token 。我应该为性能黑名单创建另一个系统吗?

    django - 选择一个有效的选择。 0不是可用的选择之一

    php - 使用 JQuery 时是否有更好的方法来检查过期的 SESSIONS?

    jsp - 将过期的 session 变量值传递给后续请求

    java - org.springframework.orm.hibernate3.HibernateSystemException : a different object with the same identifier value was already associated with the session

    Django ORM - 使用 M2M 加速过滤器

    python - DJANGO:request.POST.getlist() 到 ModelForm

    json - 生成的其余 api 没有 count 或 results 属性