开启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防护的逻辑,需要在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
相关产品推荐
相关产品推荐

