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会对请求头字段做统一转换:全大写、横杠转下划线、前缀加
第二步:直接枚举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
相关产品推荐
相关产品推荐

