多设备场景下如何正确使用refresh token解决跨设备登录失效问题
多设备Refresh Token兼容实现方案
1 数据库结构改造
原有users表单字段存储refresh_token的设计仅支持单设备登录,需调整为一对多的存储结构:
- 废弃
users表中的refresh_token字段 - 新增
user_refresh_tokens关联表,核心字段如下:id主键user_id关联用户表唯一IDrefresh_token存储当前设备的有效刷新令牌device_id设备唯一标识符device_info可选字段,存储设备类型、操作系统、客户端版本等信息,用于用户管理登录设备expired_at当前refresh token的过期时间created_at本次登录的触发时间
2 设备标识符(device_id)的获取方案
受隐私合规限制,Web端/移动端都无法稳定获取硬件级别的唯一设备ID,通用的落地方式如下:
- 客户端首次启动/访问站点时,生成一个32位随机UUID,持久化存储到浏览器LocalStorage/移动端本地沙箱中,只要用户不主动清除缓存/卸载应用,该ID永久有效
- 所有和授权相关的请求(登录、刷新token、登出),都在请求头中携带该
device_id参数
3 核心业务流程改造
3.1 登录授权流程
- 用户完成账号密码/验证码校验后,服务端读取请求携带的
device_id - 查询
user_refresh_tokens表是否存在user_id + device_id的匹配记录:- 存在:直接更新该条记录的
refresh_token和expired_at字段 - 不存在:新增一条对应
user_id、device_id的refresh token记录
- 存在:直接更新该条记录的
- 生成新的access token和refresh token返回给客户端,写入本地Cookie即可
3.2 Token刷新流程
- access token过期后,客户端携带旧refresh token +
device_id发起刷新请求 - 服务端先校验refresh token的签名合法性、是否过期
- 再查询
user_refresh_tokens表是否存在user_id + device_id + refresh_token的有效记录 - 校验全部通过后,生成新的access token和refresh token,更新该条
device_id对应记录的refresh_token和expired_at,返回给客户端
3.3 登出流程
- 客户端发起登出请求时携带
device_id - 服务端删除
user_refresh_tokens表中user_id + device_id对应的记录即可,不会影响其他设备的登录状态
4 可选安全优化
- 限制单个用户最多同时登录的设备数量,超过上限时自动淘汰最早登录的设备
- 个人中心增加登录设备管理入口,支持用户手动下线陌生设备,删除对应
device_id的记录即可 - 给refresh token设置7-30天的过期时间,定期清理数据库中的过期记录,减少无效存储
内容的提问来源于stack exchange,提问作者rejs
相关产品推荐
相关产品推荐

