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

Django中首次access token过期用户被登出 如何自动生成并设置新access token

Django 实现access token自动刷新维持登录状态方案

以下方案默认基于行业通用的双token(access token + refresh token)逻辑实现,如果你使用自定义token体系可对应调整逻辑。

1 后端核心配置(以djangorestframework-simplejwt为例)

这是Django生态最常用的JWT认证库,内置完善的token刷新能力:

  • 先完成基础配置,在settings.py中添加以下内容:
INSTALLED_APPS = [
    # 其他原有应用
    'rest_framework',
    'rest_framework_simplejwt',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
}

from datetime import timedelta
SIMPLE_JWT = {
    # access token有效期设为较短时间,降低泄露风险
    "ACCESS_TOKEN_LIFETIME": timedelta(minutes=15),
    # refresh token有效期设为较长时间,作为刷新凭证
    "REFRESH_TOKEN_LIFETIME": timedelta(days=7),
    # 可选配置:每次刷新时轮换refresh token,避免单个refresh token长期有效
    "ROTATE_REFRESH_TOKENS": True,
    # 可选配置:轮换后的旧refresh token加入黑名单,禁止复用
    "BLACKLIST_AFTER_ROTATION": True,
}
  • 配置刷新接口,simplejwt已内置实现,直接在urls.py中注册即可:
from rest_framework_simplejwt.views import TokenRefreshView

urlpatterns = [
    # 其他原有接口路由
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]

如果你使用自定义token体系,需要自己实现刷新逻辑:校验传入的refresh token有效性,校验通过则生成新的access token返回,校验失败返回401状态码提示重新登录

2 前端请求拦截逻辑(自动刷新的核心触发逻辑)

不需要每个请求单独处理,在全局请求/响应拦截器中统一处理即可:

  • 所有需要登录态的请求,都将access token放在请求头Authorization字段中,格式为Bearer <access_token>
  • 配置响应拦截器,当接口返回401状态码(代表access token已过期)时,先暂停当前所有待处理的请求,调用后端/api/token/refresh/接口,传入本地存储的refresh token
  • 如果刷新接口调用成功,将返回的新access token替换本地存储的旧值,再用新的access token重新发起之前暂停的所有请求
  • 如果刷新接口调用失败(代表refresh token也已过期),清空本地存储的所有token,直接跳转登录页要求用户重新登录

3 注意事项

  • refresh token不要存储在localStorage中,优先存储在HttpOnly属性的Cookie里,可避免XSS攻击盗取token
  • 如果开启了refresh token轮换,每次刷新接口返回的新refresh token也要同步更新到本地存储
  • 短时间内多个请求同时返回401时要加锁控制,避免重复调用刷新接口,只需调用一次刷新成功后统一重试所有请求即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:27:00