我们目前正在为我们使用 Django 构建的网站开发一个移动应用程序(使用 ionic)。每次用户登录时,我们都会在站点上使用 django session 。据我了解,django session 在客户端设置 session ID,该 ID 存储在浏览器的 cookie 中。如果移动应用程序与 django 分开,我们如何在移动应用程序中设置此 session ID?
最佳答案
我认为您至少可以通过三种方式来解决这个问题:
让基于 WebView 的混合移动应用程序在 android 和 ios 上都与 cookie 一起正常工作似乎并非易事(例如 Handling cookies in PhoneGap/Cordova )。
到目前为止,我发现的 JWT-auth 的现有解决方案似乎没有使用 Django 的 session (我觉得这很方便,因为它有一个统一的解决方案来杀死手机/计算机被盗或帐户被黑的用户的 session )。如果有人知道在 Django 的常规 session 之上进行 token 验证的可插拔解决方案,请发表评论。
详细说明方法2:
注意:做 不是 只需禁用 CSRF 保护。虽然移动应用程序不易受到 CSRF 攻击,但访问现有网站的人的浏览器仍然存在。
示例代码(对于 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/