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
相关产品推荐
相关产品推荐

