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

