如何通过axios发送HttpOnly Cookie?Django+CRAO场景下请求不携带Cookie问题
问题解决方案
你遇到的问题核心是两个规则限制叠加导致的,按以下步骤修正即可解决:
- 修正HttpOnly Cookie的设置逻辑
HttpOnly是浏览器专门为防范XSS窃取而设计的Cookie属性,规则明确禁止前端JavaScript读写该类Cookie,因此你无法通过前端的document.cookie设置带HttpOnly属性的Cookie,浏览器会直接忽略代码里的HttpOnly参数,导致Cookie设置不符合预期。
正确做法是把刷新令牌的设置逻辑移到Django后端,在登录接口的HTTP响应中通过Set-Cookie头返回刷新令牌,Django示例代码如下:from django.http import JsonResponse def login(request): # 账号密码验证、令牌生成逻辑省略 refresh_token = "生成的有效刷新令牌" response = JsonResponse({"access_token": "生成的短期访问令牌"}) response.set_cookie( key="refresh", value=refresh_token, httponly=True, samesite="Strict", path="/api/token/refresh/", secure=request.is_secure() # HTTPS生产环境必须设为True ) return response - 修正axios的withCredentials配置位置
axios.post的参数顺序为axios.post(url, 请求体, 配置项),你当前把withCredentials放在第二个参数的位置,会被axios当成请求体发送给后端,不会作为请求配置生效,因此跨域场景下不会携带Cookie。正确写法如下:
也可以全局配置axios默认开启携带凭证,避免每次请求单独配置:// 无额外请求体的场景,第二个参数传空对象,配置项放在第三个参数位置 const response = await axios.post('/api/token/refresh/', {}, { withCredentials: true });axios.defaults.withCredentials = true; - 检查Django跨域配置(前后端端口/域名不一致时必须配置)
- 安装
django-cors-headers依赖 - 在项目
settings.py中添加如下配置:
INSTALLED_APPS = [ # 其他原有应用 'corsheaders', ] MIDDLEWARE = [ # 放在中间件列表最顶部 'corsheaders.middleware.CorsMiddleware', # 其他原有中间件 ] # 允许前端请求携带Cookie CORS_ALLOW_CREDENTIALS = True # 替换为你的前端实际访问地址,禁止使用通配符* CORS_ALLOWED_ORIGINS = [ "http://localhost:3000", # 生产环境前端域名 ] # 同步添加前端地址到CSRF信任列表 CSRF_TRUSTED_ORIGINS = CORS_ALLOWED_ORIGINS - 安装
- 生产环境额外检查:如果站点采用HTTPS部署,必须给Cookie加上
Secure属性,否则部分高版本浏览器会拦截非HTTPS传输的SameSite=Strict类型Cookie。
内容的提问来源于stack exchange,提问作者honter safioun
相关产品推荐
相关产品推荐

