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

Django服务器重启后Simple JWT的Refresh Token失效,如何解决?

Django重启后Simple JWT Refresh Token失效问题解决

问题描述

我在Django Rest + ReactJS项目中使用Simple JWT实现身份验证,前端通过Axios拦截器检查Access Token是否过期,过期时自动调用刷新接口获取新的令牌对。但每次修改Django代码导致服务器重启后,Refresh Token都会失效,调用刷新接口时返回以下错误:

{
"detail": "Token is invalid or expired",
"code": "token_not_valid"
}

这导致服务器重启后用户必须重新登录,我的Simple JWT配置如下:

INSTALLED_APPS=[
    "rest_framework",
    'rest_framework_simplejwt',
    'rest_framework_simplejwt.token_blacklist',
]

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

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=1),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
    'ROTATE_REFRESH_TOKENS': True,
    'BLACKLIST_AFTER_ROTATION': True,
    'UPDATE_LAST_LOGIN': True,
    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}

解决方案

1. 固定JWT签名密钥

Simple JWT默认使用Django的SECRET_KEY签名令牌,如果你的项目在重启时动态生成了新的SECRET_KEY(比如用get_random_secret_key()生成),之前签发的令牌会因为签名密钥变更而验证失败。

解决步骤:

  • 将SECRET_KEY固定写入settings文件,或通过环境变量存储,确保服务器重启后密钥不变。
  • 也可以在SIMPLE_JWT配置中单独指定SIGNING_KEY,保证该密钥稳定:
SIMPLE_JWT = {
    # 保留原有配置
    'SIGNING_KEY': '你的固定签名字符串',
}

2. 优化前端拦截器错误处理

在Axios拦截器中捕获token_not_valid错误,自动清除本地存储的旧令牌并跳转至登录页面,提升用户体验:

axios.interceptors.response.use(
  response => response,
  async error => {
    const originalRequest = error.config;
    if (error.response.status === 401 && error.response.data.code === 'token_not_valid' && !originalRequest._retry) {
      originalRequest._retry = true;
      // 清除本地存储的令牌数据
      localStorage.removeItem('access_token');
      localStorage.removeItem('refresh_token');
      // 跳转至登录页
      window.location.href = '/login';
    }
    return Promise.reject(error);
  }
);

3. 调整令牌生命周期(可选)

当前Access Token生命周期仅1分钟,会频繁触发刷新操作,增加服务器重启后遇到问题的概率。可以适当延长生命周期,比如改为15分钟:

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=15),
    # 保留其他原有配置
}

4. 确认令牌黑名单存储方式(若启用)

如果使用了rest_framework_simplejwt.token_blacklist,默认的内存存储会在重启后丢失数据,但这不是本次问题的核心原因。若需持久化黑名单,确保使用数据库存储(默认已配置,只要执行过数据库迁移即可)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:03:19