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

Django自定义用户认证对接REST API后send_data接口识别用户为匿名如何解决

问题根因

你遇到的send_data接口无法识别已登录用户的问题,核心有两个原因:一是函数视图未显式指定认证类,导致全局配置的JWT认证逻辑未正常触发;二是请求时未正确携带认证凭证。


解决方案

1. 给函数视图补充认证配置

你配置的全局默认认证类对@api_view装饰的函数视图同样生效,但为了避免规则覆盖导致失效,建议显式指定认证类,同时保留你原有的匿名用户可访问的逻辑:
首先补充导入依赖:

from rest_framework.decorators import authentication_classes, permission_classes
from rest_framework.permissions import AllowAny
from dj_rest_auth.jwt_auth import JWTCookieAuthentication

然后修改send_data的装饰器:

@api_view(http_method_names=["POST"])
@authentication_classes([JWTCookieAuthentication])
@permission_classes([AllowAny])
def send_data(request: Request) -> Response():
    # 保留原有业务逻辑不变

2. 补充缺失的JWT配置

在settings.py的JWT相关配置段补充以下配置,解决本地开发Cookie无法携带的问题:

REST_USE_JWT = True
JWT_AUTH_COOKIE = "my-app-auth"
# 新增以下配置
JWT_AUTH_REFRESH_COOKIE = "my-refresh-token"
JWT_AUTH_SAMESITE = "Lax"
# 本地开发用http协议时设为False,生产环境切换为https后改成True
JWT_AUTH_SECURE = False

如果你的项目是前后端分离跨域部署,还需要安装django-cors-headers完成跨域配置,开启Cookie跨域传输:

# settings.py 新增配置
INSTALLED_APPS += ["corsheaders"]
MIDDLEWARE.insert(0, "corsheaders.middleware.CorsMiddleware")

CORS_ALLOW_CREDENTIALS = True
# 替换为你的前端实际访问地址
CORS_ALLOWED_ORIGINS = [
    "http://localhost:8080",
    "http://127.0.0.1:8080",
]

3. 确保请求携带正确的认证凭证

  • 如果是浏览器端访问:登录成功后会自动写入my-app-authCookie,后续请求只要同域/跨域配置了withCredentials=true,会自动携带Cookie完成认证
  • 如果是接口工具(Postman、Apifox)调用:先调用登录接口拿到Cookie,后续请求自动携带即可。如果需要支持请求头传Token的方式,可以在全局认证类中新增配置:
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "dj_rest_auth.jwt_auth.JWTCookieAuthentication",
        # 新增支持请求头传Token
        "rest_framework_simplejwt.authentication.JWTAuthentication",
    ],
}

注意要先安装JWT依赖:pip install djangorestframework-simplejwt


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:15:03