You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JWT刷新令牌过期后如何维持用户当前会话?

嘿,这个问题挺实用的——毕竟没人愿意频繁被要求重新登录,破坏使用体验。结合你给出的JWT配置,咱们聊聊几种可行的解决方案:

方案1:滑动会话(Sliding Session)机制

这是最常用的思路,核心逻辑是用户每次用有效的refresh token获取新access token时,同时返回一个新的refresh token并重置它的过期时间。只要用户在refresh token过期前有活跃操作,会话就能一直延续。

你只需要调整SIMPLE_JWT的配置,开启这个功能:

from datetime import timedelta

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(seconds=60),
    'REFRESH_TOKEN_LIFETIME': timedelta(seconds=120),
    # 开启滑动刷新:每次用refresh token换access token时,返回新的refresh token
    'ROTATE_REFRESH_TOKENS': True,
    # 可选:禁止旧的refresh token继续使用(防止重复刷新带来的安全风险)
    'BLACKLIST_AFTER_ROTATION': True,
}

⚠️ 注意:如果开启BLACKLIST_AFTER_ROTATION,你需要配置一个黑名单存储(比如用django-redis),不然会报错——Simple JWT需要地方存放失效的旧token。

方案2:长期refresh token + 前端静默刷新

如果滑动会话还不够,你可以设置一个有效期更长的refresh token(比如7天),然后让前端做静默刷新

  • 前端监听access token的过期时间,在它快过期前(比如提前10秒)自动调用refresh接口获取新的access token
  • 用户完全感知不到这个过程,只要一直在使用应用,会话就不会中断
  • 但要注意:长期refresh token有安全风险,建议结合设备绑定、IP校验等额外安全措施降低风险
方案3:「记住我」定制化refresh token

你可以在登录时给用户提供「记住我」选项,根据用户选择返回不同有效期的refresh token:

  • 用户勾选「记住我」:返回有效期很长的refresh token(比如30天)
  • 用户不勾选:使用你当前配置的短有效期

实现思路示例:

from rest_framework_simplejwt.tokens import RefreshToken
from datetime import timedelta
from rest_framework.response import Response
from django.contrib.auth import authenticate

def custom_login_view(request):
    # 先验证用户账号密码
    username = request.data.get('username')
    password = request.data.get('password')
    user = authenticate(request, username=username, password=password)
    
    if user:
        refresh = RefreshToken.for_user(user)
        # 根据「记住我」选项调整refresh token有效期
        if request.data.get('remember_me'):
            refresh.set_exp(lifetime=timedelta(days=30))
        return Response({
            'access': str(refresh.access_token),
            'refresh': str(refresh),
        })
    # 处理登录失败的情况...
额外提醒

不管用哪种方案,都无法完全避免refresh token真正过期的场景(比如用户几周没登录),这时候还是得引导用户重新登录——我们能做的只是尽量减少这种情况的发生,提升用户体验。另外,安全层面要注意:别把refresh token存在localStorage(容易遭XSS攻击),建议存在带httpOnlysecuresameSite属性的Cookie里。

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

火山引擎 最新活动