Django REST Framework如何实现用户登录设备列表及会话终止功能
完全可以通过Django REST Framework(DRF)实现该需求,核心逻辑围绕登录会话的持久化存储、设备信息采集、会话生命周期管理三个模块实现即可。
扩展会话存储结构,绑定设备信息
如果你用Django原生Session做身份认证:默认的django.contrib.sessions内置Session表缺少用户关联、设备信息等字段,你可以新建一个UserSession模型和内置Session表做一对一关联,存储字段包括:关联用户ID、设备名称、设备类型(移动端/桌面端/平板)、登录IP、登录地点、User-Agent、登录时间、最后活跃时间。
如果你用JWT做身份认证:因为JWT本身是无状态的,需要额外建UserRefreshToken表做有效token持久化,存储字段包括:关联用户ID、refresh_token明文哈希值、设备相关信息、过期时间、是否已失效标记,也可以直接复用djangorestframework-simplejwt自带的黑名单功能减少重复开发。登录阶段采集存储设备信息
用户调用登录接口时,从请求头解析User-Agent提取设备参数,也可以让前端主动上报设备名称、设备唯一标识(如移动端设备ID),和生成的会话/refresh token绑定后存入对应数据表,建议给用户ID字段加索引,提升后续查询速度。开发「已登录设备列表」查询接口
实现一个需要身份校验的GET接口,仅返回当前登录用户关联的所有未过期会话/有效token对应的设备信息,返回字段可包含设备名称、设备类型、登录地点、登录时间、最后活跃时间,不要返回session_key、token等敏感信息。开发「终止指定设备会话」接口
实现一个需要身份校验的操作接口,接收待终止的会话ID/refresh token ID为参数,校验目标会话属于当前用户后执行失效操作:- 原生Session认证:直接删除对应Session记录,或将其过期时间修改为当前时间
- JWT认证:将对应refresh token加入黑名单,或直接删除
UserRefreshToken表中的对应记录,若有access token缓存黑名单也可以同步清理
可额外支持「终止所有其他设备会话」功能,只需在批量失效时排除当前请求携带的会话/token对应的记录即可。
- 给异常登录的设备加风险标记,比如非常用地点登录、新设备登录的会话在列表里做特殊标注,方便用户识别非本人操作
- 过期的会话不需要立即删除,可以归档保留,支持用户查询历史登录设备记录
- 终止会话时可给对应设备推送通知,告知用户该设备的登录会话已被手动下线
内容的提问来源于stack exchange,提问作者Aditya Pathak

