DRF项目Postman调用登录接口遇CSRF cookie未设置403错误
DRF登录端点Postman 403 CSRF问题解决思路
核心原因
rest_framework.urls中包含的login/视图是基于Django原生的LoginView(而非DRF的APIView),默认强制CSRF校验;而你其他正常的POST端点应该是使用了DRF的视图类,且配置了Token/JWT等豁免CSRF的认证方式,所以不受影响。
具体解决步骤
1. 正确完成CSRF Token的获取与携带流程
- 先向
api/auth/login/发送GET请求,从响应的Cookie中提取csrftoken值(默认Cookie名是csrftoken,若修改过CSRF_COOKIE_NAME则对应使用自定义名称) - 在Postman中配置:
- 开启「Automatically send cookies」(设置里的Cookie选项)
- 在POST请求的Headers中添加
X-CSRFTOKEN: [提取到的csrftoken值] - 确保请求的Cookie中携带
csrftoken=[提取到的值]
2. 检查CSRF相关配置项
- 确认
settings.py中CSRF_TRUSTED_ORIGINS包含Postman请求的来源,比如本地测试添加:CSRF_TRUSTED_ORIGINS = [ "http://localhost:8000", "http://127.0.0.1:8000" ] - 若本地使用HTTP而非HTTPS,需将
CSRF_COOKIE_SECURE设为False:CSRF_COOKIE_SECURE = False CSRF_COOKIE_HTTPONLY设为False不影响Postman,但如果后续要支持浏览器端请求,建议保持默认False(允许前端读取Cookie)
3. 替换为DRF风格的登录视图(彻底避免CSRF问题)
如果不想依赖Django原生登录的CSRF校验,可以替换rest_framework.urls的配置,改用DRF的认证视图:
- 首先在项目中配置DRF的Token认证:
# settings.py REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', # 其他认证类... ] } - 在
urls.py中替换原有的登录端点:
这个视图不需要CSRF校验,直接POST用户名和密码即可返回Token,更适合API场景。from rest_framework.authtoken.views import obtain_auth_token urlpatterns = [ # 替换原有的api/auth/配置 path('api/auth/login/', obtain_auth_token, name='api_login'), # 其他路由... ]
4. Postman配置细节排查
- 检查Postman的请求域名是否和Django服务的域名完全一致(比如不要混用
localhost和127.0.0.1) - 使用Postman的「Cookie Manager」查看是否正确保存了从GET请求获取的
csrftokenCookie - 确保POST请求的Content-Type是
application/x-www-form-urlencoded或multipart/form-data(Django原生LoginView默认支持的格式),如果用application/json需要额外配置视图支持
内容的提问来源于stack exchange,提问作者tn sduser
相关产品推荐
相关产品推荐

