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

dj-rest-auth + JWT登录功能异常:旧Token未清除导致报错求助

dj-rest-auth + JWT 登录报错问题解决与机制解析

问题根源

当你调用登录接口时,浏览器会自动带上之前存在Cookie里的过期JWT Token(access_token或refresh_token),dj-rest-auth的默认认证逻辑会优先验证请求中的Token,而非直接处理用户名密码。一旦Token过期或无效,就会返回你看到的token_not_valid错误,跳过了正常的用户名密码登录流程。

解决方案

  • 前端主动清理旧Cookie:在调用登录接口前,删除浏览器中存储的JWT相关Cookie(默认键名是access_token和refresh_token)。示例JS代码:
    document.cookie = "access_token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
    document.cookie = "refresh_token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
    
  • 后端配置登录接口跳过Token验证:修改Django路由,让登录接口绕过JWT认证检查。示例配置:
    # urls.py
    from dj_rest_auth.views import LoginView
    from rest_framework.permissions import AllowAny
    
    urlpatterns = [
        # 其他路由...
        path('dj-rest-auth/login/', LoginView.as_view(
            authentication_classes=[],
            permission_classes=[AllowAny]
        ), name='rest_login'),
    ]
    
  • 请求登录接口时禁用Cookie携带:如果使用axios等HTTP库,调用登录接口时设置withCredentials: false,避免自动带上旧Cookie。注意此操作会影响其他依赖Cookie的接口,需谨慎使用。

运行机制逻辑

  1. 首次登录流程:提交用户名密码后,后端生成短有效期的access_token和长有效期的refresh_token,将两者存入HttpOnly Cookie(防止前端篡改),同时在响应体返回Token内容。
  2. access_token过期后的正确流程:应调用/dj-rest-auth/token/refresh/接口,传入有效的refresh_token。后端验证通过后,返回新的access_token(部分配置下会同时刷新refresh_token),无需重新登录。
  3. 直接登录触发错误的原因:dj-rest-auth的登录接口默认启用JWT认证检查,只要请求中携带Token(Cookie或Authorization头),就会优先验证Token有效性。过期Token会直接触发错误,不会进入用户名密码校验环节。
  4. refresh_token过期后的情况:此时调用refresh接口会报错,必须重新登录。但如果Cookie中仍存着过期的Token,登录请求会自动带上旧Token,再次触发token_not_valid错误,因此必须先清理旧Cookie再执行登录操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:12:35