Echo框架怎么结合Redis实现JWT黑名单

老萱小哥_7493

老萱小哥_7493

2026-10-21

695人浏览

原创

必须手动添加redis黑名单中间件,因echo-jwt/v4仅校验签名与时间;需在它之后链式注册,从c.get("user")取token、提取jti、用revoked:{jti}键查redis是否存在。

echo框架怎么结合redis实现jwt黑名单

echo-jwt/v4 之后必须加自定义中间件查 Redis

echo-jwt/v4 默认只做签名和时间校验,token.Valid 方法完全不碰 Redis 或 DB。它把解析好的 *jwt.Token 放进 c.Get("user"),但黑名单检查得你手动补——不是改它的配置,而是在它之后链式注册一个新中间件。

常见错误现象:echo-jwt 验证通过了,但用户刚登出,请求仍被放行;或者中间件里重复调用 ParseWithClaims 导致 panic。

  • 确保 echo-jwt 中间件已注册,且顺序在黑名单中间件之前
  • 黑名单中间件中直接从 context 取值:token, ok := c.Get("user").(*jwt.Token),别再自己 parse
  • 提取 jti 字段:jti, ok := token.Claims.(jwt.MapClaims)["jti"].(string);若没设 jti,fallback 到 token.Raw(但不推荐,体积大、易冲突)
  • Redis key 命名统一用 revoked:{jti},TTL 设为与 token 剩余有效期一致(不是固定值)

Redis 存什么、存多久,直接影响黑名单有效性

存错字段或 TTL 不对,会导致漏检或内存爆炸。Redis 不是“存 token 字符串”,而是存一个轻量 key-value:key 是 revoked:{jti},value 可为空字符串,靠 TTL 自动清理。

性能影响很直接:每次鉴权多一次 Redis GET,必须用 pipeline 或连接池压测;兼容性上,go-redis/v9 的 Exists 返回 int64,别拿它和 true 直接比。

  • TTL 必须动态计算:用 token.Claims.(jwt.MapClaims)["exp"] 减去当前时间戳(秒级),结果 ≤ 0 就跳过写入
  • 写入时用 SET revoked:{jti} "" EX {ttl} NX(NX 防重复,EX 确保自动过期)
  • 查的时候用 Exists,不是 Get——我们只关心 key 是否存在,不读 value
  • 如果用的是 redis.Client(v9),调用 client.Exists(ctx, key).Val(),返回 1 表示在黑名单

KeyFunc 里不拦 alg: none 和时间漂移,黑名单形同虚设

即使 Redis 黑名单逻辑写对了,如果 echo-jwt.Config.KeyFunc 没做基础防护,攻击者能绕过签名验证,直接伪造任意 jti,让黑名单查询失效。

redis-tools
redis-tools

按类别查找Redis命令、检测服务器连接、监控键数量和内存占用,支持离线速查表。

下载

典型错误:KeyFunc 只返回密钥,不校验 token.Header["alg"];或没传 jwt.WithValidTimeFunc,导致服务端时间快几秒就误判 token 过期,用户刚登录就 401。

  • 在 KeyFunc 中显式拒绝 alg == "none":if token.Header["alg"] == "none" { return nil, errors.New("alg cannot be none") }
  • 启用时间容错:echo-jwt.Config.TimeFunc = time.Now,并在 VerifyExpiresAt 等逻辑外加 jwt.WithValidTimeFunc(func(t int64) bool { return time.Now().Add(5 * time.Second).Unix() > t })
  • exp 字段必须是秒级 int64,不是毫秒——Golang 的 time.Now().Unix() 正确,time.Now().UnixMilli() 会立刻报 "token is expired"

登出接口写 Redis 要防竞态,查黑名单要短路

用户点登出后立刻发一个带旧 token 的请求,可能因 Redis 写入延迟,导致黑名单还没生效就被放行。这不是概率问题,是必然发生的窗口期。

另一个坑是:黑名单中间件里没 early return,查完 Redis 还继续往下走,最后还是进了业务 handler。

  • 登出接口必须用原子命令写 Redis:SET revoked:{jti} "" EX {ttl} NX,NX 保证只写一次,避免并发重复登出放大延迟
  • 黑名单中间件中,一旦 Exists 返回非零,立刻 return echo.NewHTTPError(http.StatusUnauthorized, "token revoked"),不走后续逻辑
  • 不要在中间件里做重试或 fallback——查不到就是有效,查到了就必须拒,逻辑必须干净
  • 注意时钟漂移:如果服务集群节点时间不一致,建议所有机器同步 NTP,或统一用 Redis 服务器时间(TIME 命令)校准 TTL 计算

Redis 黑名单本质是用空间换可控性,但它不解决 jti 生成碰撞、客户端不清理 token、或网络重放等问题。真正安全的退出,得把 jti 生成、登出写入、鉴权拦截、时钟对齐这四步全串起来,少一环,就等于没关严门。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4549

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4115

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7632

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

643

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

756

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

7562

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1160

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1136

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6598

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习