You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中替换原有的登录端点:
    from rest_framework.authtoken.views import obtain_auth_token
    
    urlpatterns = [
        # 替换原有的api/auth/配置
        path('api/auth/login/', obtain_auth_token, name='api_login'),
        # 其他路由...
    ]
    
    这个视图不需要CSRF校验,直接POST用户名和密码即可返回Token,更适合API场景。

4. Postman配置细节排查

  • 检查Postman的请求域名是否和Django服务的域名完全一致(比如不要混用localhost和127.0.0.1)
  • 使用Postman的「Cookie Manager」查看是否正确保存了从GET请求获取的csrftoken Cookie
  • 确保POST请求的Content-Type是application/x-www-form-urlencoded或multipart/form-data(Django原生LoginView默认支持的格式),如果用application/json需要额外配置视图支持

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:53:20