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

