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

基于Django REST Framework JWT实现单账号禁止多端登录

实现django-rest-framework-simplejwt单账号单端登录(禁止多端同时在线)

针对你使用djangorestframework-simplejwt==4.4.0时遇到的同一账号多端登录问题,可通过以下步骤实现单账号仅允许当前登录端在线的功能:

1. 启用Token黑名单功能

首先利用simplejwt自带的黑名单机制来作废旧token:

  • 在项目settings.py的INSTALLED_APPS中添加黑名单应用:
INSTALLED_APPS = [
    # ... 其他已有应用
    'rest_framework_simplejwt.token_blacklist',
]
  • 执行数据库迁移,创建黑名单相关数据表:
python manage.py migrate

2. 自定义Token获取视图

重写TokenObtainPairView,在用户每次登录生成新token时,自动将该用户之前的所有有效refresh token加入黑名单:
在你的应用views.py中添加以下代码:

from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework_simplejwt.models import OutstandingToken, BlacklistedToken

class CustomTokenObtainPairView(TokenObtainPairView):
    def create(self, request, *args, **kwargs):
        # 调用父类逻辑生成新的access/refresh token
        response = super().create(request, *args, **kwargs)
        
        # 获取当前登录的用户
        user = request.user
        
        # 查询该用户所有未过期的token记录
        existing_tokens = OutstandingToken.objects.filter(user=user)
        
        # 将除新生成的token外的所有旧token加入黑名单
        for token in existing_tokens:
            if token.token != response.data['refresh']:
                BlacklistedToken.objects.get_or_create(token=token)
        
        return response

3. 更新URL路由配置

将原有的Token获取路由替换为自定义视图,修改项目urls.py:

from .views import CustomTokenObtainPairView

urlpatterns = [
    # ... 其他路由
    path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]

效果验证

  • 用户在A端登录后可正常使用token访问接口;
  • 同一用户在B端登录时,会生成新的token,同时A端的旧refresh token会被加入黑名单;
  • A端的旧access token过期后无法刷新,旧refresh token也无法再使用,实现单账号仅当前登录端在线的限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 12:06:44