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

React向Django API发起JWT认证请求仅半数成功,报401错误求助

看起来你遇到了JWT认证间歇性失败的问题——刚登录时请求能成功,之后却频繁返回401,哪怕Redux里明明显示token存在。我来帮你一步步排查可能的原因:

1. 优先排查JWT Token是否过期

这是最常见的诱因。JWT默认过期时间很短(通常是5分钟),刚登录时的token处于有效期内,过一段时间就会失效,但Redux里还存着旧的无效token。

  • 后端配置检查:看看你的Django settings.py有没有设置JWT过期时间,如果没有,添加以下配置来延长有效期(比如设置为24小时):
import datetime

JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(hours=24),
    'JWT_ALLOW_REFRESH': True,  # 开启token刷新功能
}
  • 前端验证token状态:当请求失败时,把this.props.token打印出来,复制到jwt.io(本地解析,无需上传数据)查看exp字段(过期时间戳),确认token是否已经过期。

2. 确认Authorization请求头的正确性

你的代码里写了Authorization: 'JWT ' + this.props.token,但要注意几个细节:

  • 确保JWT后面有空格(你的代码里是对的,但有时候会不小心漏掉);
  • 检查token是否带有多余的空格或引号,比如Redux里的token是否被意外拼接了其他字符;
  • 请求失败时,在浏览器开发者工具的Network标签里查看请求头,确认Authorization头是否正确携带了完整的token。

3. 验证Redux中token的有效性

Redux显示token存在不代表它是有效的:

  • 有没有可能用户注销后,Redux里的token没有被清空?或者后端的JWT密钥(SECRET_KEY)被修改过,导致旧token无法通过验证?
  • 如果你的应用没有持久化token(比如存在localStorage/sessionStorage),刷新页面后Redux的token会丢失,但你说刚登录后能成功、之后失败,这个可能不是主要原因,但还是要确认。

4. 跨域请求的Header权限问题

你的前端和后端域名/端口不同(比如前端是localhost:3000,后端是127.0.0.1:8000),如果使用了django-cors-headers,要确保允许Authorization头:
在settings.py里添加:

CORS_ALLOW_HEADERS = [
    'authorization',
    'content-type',
]

虽然你刚登录能成功,但有时候浏览器的跨域策略可能会在某些场景下拦截自定义头,这个可以排查一下。

5. 通过后端日志定位具体失败原因

开启DRF和JWT的日志,查看认证失败的详细信息:
在settings.py里添加日志配置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'rest_framework_jwt': {
            'handlers': ['console'],
            'level': 'DEBUG',
        },
    },
}

这样当请求返回401时,Django终端会打印出具体的失败原因,比如Token has expired(token过期)或者Invalid signature(签名无效),能帮你快速定位问题。

额外的代码错误提醒

虽然这不是导致401的原因,但你的前端和后端数据字段不匹配:

  • 前端传的是stripeToken:JSON.stringify({stripeToken, amount})
  • 后端取的是request.data['token']:source=request.data['token']['id']
    这会导致KeyError,应该改成前端传token: stripeToken,或者后端取request.data['stripeToken'],否则即使认证成功,请求也会返回500错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:47:32