在前后端分离项目中,后端Django 登录代码中使用session。
request.session['username'] = user_obj.username
request.session['user_id'] = user_obj.id
request.session['is_login'] = True
后端服务器返回response header中有set-cookie属性。浏览器接收到set-cookie属性会自动把加入到cookie里面。
当同一台主机时,request header会携带cookie访问api。但是跨域请求时(已经解决跨域问题corsheaders)set-cookie没有生效,并且后续request header中也没有携带cookie。尝试修改以下跨域配置,依然没有用。
# 跨域增加忽略
CORS_ALLOW_CREDENTIALS = True # 指明在跨域访问中,后端是否支持对cookie的操作
CORS_ORIGIN_ALLOW_ALL = True # 允许所有主机请求你的API
# CORS_ORIGIN_WHITELIST = ( # 跨域请求白名单,为空时默认为全部
# 'http://192.168.8.189:8085', '*'
# )
后来发现,SameSite=Lax这个会禁止跨域请求时携带cookie,然而我们是需要携带cookie的。所以只要修改Django的配置,就可以啦。
# 会话cookie上SameSite标志的值。此标志防止在跨站点请求中发送cookie,从而防止CSRF攻击,并使某些窃取会话cookie的方法不可能实现。
SESSION_COOKIE_SAMESITE = None # response header set-cookie:samesite=lax Default: 'Lax'
CSRF_COOKIE_SAMESITE = None
此时,set-cookie中SameSite=Lax没有了。前端就可以携带cookie跨域请求了。但是这样做可能不安全。