You need to enable JavaScript to run this app. 开启CSRF保护时如何用curl刷新DRF simplejwt的JWT access token
优惠活动
大模型
产品
解决方案
定价
更多

开启CSRF保护时如何用curl刷新DRF simplejwt的JWT access token

可以实现你的需求,错误原因是CSRF令牌的传递方式不全

Django的CSRF校验逻辑要求:除了在Cookie中携带csrftoken值,POST等会修改服务端数据的请求,还需要额外在请求头或者请求体中传递CSRF令牌做双重校验,你当前的curl命令只传了Cookie中的csrftoken,缺少第二重校验参数,因此返回403错误。

修正后的curl请求命令

把你从admin页面拿到的CSRF令牌值同时填到请求头的X-CSRFToken字段即可,完整命令如下:

curl -X POST \
-H "Authorization: Bearer {refresh-token-value}" \
-H "X-CSRFToken: {csrf-token-value}" \
-b "csrftoken={csrf-token-value}" \
http://127.0.0.1:8000/auth/token_login/refresh/
后续JWT存Cookie+CSRF防护的配置要点

如果你后续要正式实现JWT令牌存储在Cookie、同时开启CSRF防护的逻辑,需要在Django settings.py中添加如下配置:

# simplejwt Cookie存储配置
SIMPLE_JWT = {
    # 配置access、refresh令牌存储在Cookie中
    "AUTH_COOKIE": "access_token",
    "AUTH_COOKIE_REFRESH": "refresh_token",
    # 本地开发时设为False,生产环境HTTPS下必须设为True
    "AUTH_COOKIE_SECURE": False,
    # 禁止JS读取Cookie,防范XSS攻击
    "AUTH_COOKIE_HTTPONLY": True,
    "AUTH_COOKIE_SAMESITE": "Lax",
}

# CSRF全局配置
CSRF_COOKIE_SAMESITE = "Lax"
CSRF_COOKIE_HTTPONLY = False # 允许JS读取csrftoken值,方便前端放在请求头中
# 配置允许的跨域源,按需修改
CSRF_TRUSTED_ORIGINS = ["http://127.0.0.1:8000", "http://localhost:8000"]

配置完成后,刷新接口会自动从Cookie读取refresh令牌,不需要再手动在Authorization头中传递refresh token的值,所有POST/PUT/DELETE类请求只要同时携带csrftoken Cookie和X-CSRFToken请求头即可通过校验。

内容的提问来源于stack exchange,提问作者maja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 10:51:02