基于Redis集群的JWT实现方案(redis集群jwt)
Redis作为一种定义为高级key-value缓存,在存取时间短的情况下搭建的NoSQL,是存储持久化的信息的最佳选择,有着高可用性、快速响应时间等特点。而JSON Web Token(JWT)是用于在客户端和服务器之间传输信息的应用程序的标准,由于其核心的几大特性(独立性,无状态性,易扩展性,安全性),JWT在Web开发和RESTful架构中越发普及。
基于Redis集群来实现JWT具有一定的突出优势,一方面Redis可以实现极高的性能和提供高可用性,并且Redis集群可以实现check-out token,从而避免令牌因概率超时而被删除;另一方面,Redis集群提供了原子性,能够保证多线程访问和有序性,从而避免出现数据库存储token出现交叉添加等问题,而且Redis的存储方式也极大的减少了数据库的负载存储压力。
实现JWT基于Redis集群一般采用labstack/echo框架,下面是针对echo框架实现JWT基于Redis集群的代码实现:
// 注册JWT中间件
e := echo.New()
config := jwt.JWTConfig{
SigningKey: “justforTesting”, //secret秘钥
SigningMethod: “HS256”, //jwt签名方法
Done: doneFunc,
}
e.Use(jwt.JWTWithConfig(config))
// 将token缓存到Redis集群
redisConn,err := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{“host:7777″,”host2:7777”},
Password “password”,
})
// 添加token实现
func doneFunc (clms jwt.Clms) error {
token, err := jwt.GenerateToken(clms)
if err != nil {
return err
}
jwt.StoreToken(token, clms, redisConn) // stores the token in redis
return nil
}
// 验证token
func validateFunc (token string) (jwt.Clms, error) {
clms, err := jwt.ParseToken(token, redisConn)
if err != nil {
return jwt.Clms{}, err
}
return clms, nil
}
上述就是基于Redis集群实现JWT的过程,使用Redis集群可以极大加快token验证的处理速度,而且具有较高的可用性,可以在多伺服端机器上保证token处理的连续性。