logout如果一个用户要保持其它 的login的refresh-token

发布时间:2026/9/22 7:15:31

logout如果一个用户要保持其它 的login的refresh-token
这通常是一个多设备登录管理的需求即用户在退出当前设备时希望不影响其他已登录设备手机、平板、其他浏览器的会话。要让你的logout接口实现这个效果关键在于区分“退出登录”与“撤销所有凭证”。以下是具体的实现策略1. 核心逻辑建立“设备指纹”映射不要只把refresh_token与用户 ID绑定而要绑定到用户 ID 设备ID。生成设备ID在每次登录时服务端生成一个唯一标识如device_id并将其返回给客户端或存入客户端 Cookie。存储结构在数据库或 Redis 中存储refresh_token时使用复合主键(user_id, device_id)或存储映射关系user_id - [device_id_1, device_id_2]。2. 注销接口Logout的实现调整当用户只点击“退出当前设备”时你的logout接口应该执行以下操作go// 伪代码示例 func LogoutHandler(c *gin.Context) { // 1. 获取当前请求携带的 refresh_token token : c.GetHeader(Authorization) // 2. 解析 token获取其中的 user_id 和 device_id claims : parseToken(token) userId : claims.UserID deviceId : claims.DeviceID // 关键必须从 token 载荷中读取 // 3. **关键操作**仅删除该特定 (user_id, device_id) 对应的 refresh_token err : redisClient.Del(ctx, fmt.Sprintf(refresh:%s:%s, userId, deviceId)) // 4. 返回成功客户端清除本地的 token // 此时数据库/Redis 中仍保留着其他设备的 refresh_token它们依然有效 }3. 存储方式建议以 Redis 为例为了支持快速删除单个设备推荐使用Hash或String 索引结构Key 设计refresh:{user_id}:{device_id}优点删除时只需精准DEL这个 Key不影响其他 Key。缺点如果想“一键踢出所有设备”需要遍历所有 Key。辅助索引用于“踢出所有设备”如果你还想保留“注销所有设备”的功能可以再维护一个 SetKey:user_devices:{user_id},Value:[device_id_1, device_id_2]单设备登出DEL refresh:user:device1不移除 Set 里的记录也可以旧设备下次用旧 ID 登录会覆盖。全部登出遍历 Set删除所有refresh:user:*。4. 签发 Token 时的改造在登录/刷新 Token 的接口中你需要将device_id写入 JWT 的 Payload 中go// 生成 token 时 claims : jwt.RegisteredClaims{ Subject: userID, ID: deviceID, // 将设备ID存入JTI或自定义字段 ExpiresAt: jwt.NewNumericDate(time.Now().Add(7 * 24 * time.Hour)), }这样当Logout接口收到请求时直接从请求头解析出的 Token 里拿到device_id就知道当前操作的是哪台设备了。5. 客户端前端的配合服务端返回 200 OK 后前端清除本地存储的access_token和refresh_token。注意服务端删除的是该设备的refresh_token但其他设备浏览器里的access_token可能还没过期。由于access_token是无状态的如果其他设备拿着旧的access_token请求资源依然会通过只有当该设备需要刷新令牌refresh_token已失效或强制访问需要最新权限的接口时才会要求重新登录。这是一种常见的折中方案。总结方案对比场景操作方式对其他设备的影响单设备退出你的需求精准删除refresh_token记录的WHERE user_id ? AND device_id ?无影响其他设备正常使用修改密码/账号异常批量删除DELETE FROM tokens WHERE user_id ?所有设备均需重新登录服务端无状态 JWT不存库将(user_id, device_id)加入 Redis 黑名单其他设备可能因黑名单匹配而失效需谨慎设计黑名单 Key推荐做法使用上述“存储型 Refresh Token Device ID”方案。这是目前业界如 OAuth 2.0 的device_id参数比较成熟的做法能完美实现“退出当前设备而不影响其他设备”。如果你需要更详细的代码示例比如 Gin Redis 的具体实现或者想了解如何实现“一键踢出所有设备”的反向操作可以告诉我我继续补充。

相关新闻

【限时解密】某头部AIGC平台2026内测副业通道:仅开放给持有NLP基础认证+100小时标注经验者(附3天速通备考路线)

【限时解密】某头部AIGC平台2026内测副业通道:仅开放给持有NLP基础认证+100小时标注经验者(附3天速通备考路线)

2026/9/10 1:59:16

更多请点击: https://intelliparadigm.com 第一章:AI副业 2026新机会 随着大模型轻量化、边缘AI芯片普及与开源生态爆发式演进,2026年AI副业已从“技术极客专属”转向“可规模化交付的微型服务经济”。开发者无需自建训练集群,即…

2026大模型GEO站点结构:3个层级逻辑提收录,零成本提32%抓取权重附架构表

2026大模型GEO站点结构:3个层级逻辑提收录,零成本提32%抓取权重附架构表

2026/9/9 17:35:36

作者:张钧泽(曌选科技GEO优化主理人,20生产级RAG/GEO项目经验)做GEO优化的企业普遍有个认知误区,觉得只要内容质量够好,就一定会被大模型收录,实际上恰恰相反。 张钧泽(曌选科技GEO优…

Linus说内核不反AI工具——但做嵌入式18年的我告诉你,AI写的驱动你敢用吗?

Linus说内核不反AI工具——但做嵌入式18年的我告诉你,AI写的驱动你敢用吗?

2026/9/5 22:20:20

Linus说内核不反AI工具——但做嵌入式18年的我告诉你,AI写的驱动你敢用吗?一句话观点:Linus说内核不反AI是对的,但AI生成的驱动代码在嵌入式场景下风险比互联网后端高两个数量级——内核社区要管的不应该是"能不能用AI"…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/21 18:38:46

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/21 18:41:09

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/21 18:36:40

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/21 18:37:26

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/21 18:40:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/21 18:36:17

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/22 0:19:28

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/21 23:38:13

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/22 0:48:53

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…