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

多设备场景下如何正确使用refresh token解决跨设备登录失效问题

多设备Refresh Token兼容实现方案

1 数据库结构改造

原有users表单字段存储refresh_token的设计仅支持单设备登录,需调整为一对多的存储结构:

  • 废弃users表中的refresh_token字段
  • 新增user_refresh_tokens关联表,核心字段如下:
    • id 主键
    • user_id 关联用户表唯一ID
    • refresh_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:15:06