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

Django后端无法获取前端传递的simplejwt令牌问题咨询

Django读取前端传入JWT令牌的排查方案

第一步:先确认令牌的实际传输位置

不要默认令牌一定放在请求头里,先打开浏览器开发者工具的Network面板,找到对应请求,明确两个令牌的存放位置:

  • 如果令牌在Query参数中:直接通过request.GET.get('app_token')、request.GET.get('access_token')取值,不要去request.META里查找
  • 如果令牌在请求体中:
    • 表单格式(application/x-www-form-urlencoded)用request.POST.get('app_token')取值
    • JSON格式用DRF的request.data.get('app_token'),或原生Django用json.loads(request.body).get('app_token')取值,注意request.POST无法解析JSON格式请求体
  • 如果令牌在自定义请求头中:重点排查两个高频问题
    • Django会对请求头字段做统一转换:全大写、横杠转下划线、前缀加HTTP_才会存入request.META,比如头名是App-Token对应键为HTTP_APP_TOKEN,头名是app_token不会自动转横杠
    • Nginx、Apache等Web服务器默认会直接丢弃带下划线的自定义请求头,不会转发给Django,这是90%同类问题的根因,本地用runserver调试时无此限制,极易出现本地正常、线上取不到值的情况,需要在Nginx配置中加underscores_in_headers on;并重载配置。

第二步:直接枚举Django侧收到的所有字段,不要猜键名

临时加一个调试接口,直接输出所有和token相关的请求字段,避免手动凑键名出错:

from django.http import JsonResponse
import json

def debug_req(request):
    # 提取所有带token关键词的META键
    token_related_meta = [k for k in request.META.keys() if "token" in k.lower()]
    resp = {
        "token_meta_keys": token_related_meta,
        "query_params": dict(request.GET),
        "form_params": dict(request.POST),
    }
    # 尝试解析JSON请求体
    try:
        resp["json_body"] = json.loads(request.body)
    except:
        resp["json_body"] = None
    return JsonResponse(resp, safe=False)

请求该接口后直接从返回值里找对应令牌的键名,直接取用即可。

第三步:跨域与SimpleJWT适配配置

  • 如果项目配置了跨域(django-cors-headers),需要把自定义的两个请求头加到CORS_ALLOW_HEADERS配置列表中,否则浏览器OPTIONS预检阶段会拦截请求,自定义头不会传到后端
  • 如果需要让SimpleJWT自动识别自定义令牌完成认证,不需要手动从请求里读值,可以自定义认证类继承JWTAuthentication,重写get_header方法适配自定义头的读取逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:57:32