当我们在进行用户登录校验时,需要存储用户信息实现状态化,具体内容可参考文章cookie、session、token与JWT
我们先经过用户校验,在用户校验成功后通过CreateToken(uid string, expireDuration time.Duration)来创建jwt字符串,然后返回给客户端,客户端在之后对服务端进行请求时都会携带jwt信息,设置一个校验中间件通过parseToken(tokenString string)对jwt进行解析校验,校验通过后得到对应的自定义信息。
可将token与用户信息存入redis中实现白名单校验,key:uid,val:token;通过将验证成功的Uid到redis中找出相对应的之前存入的token,在将其与本次的token进行比对,看是否一致,以此来实现单点登录与token过期。
具体实现可参考下面代码和源码
package verify
import (
"time"
"github.com/dgrijalva/jwt-go"
)
// 私钥
var jwtKey=[]byte("My Secret")
// 获取token信息
func CreateToken(uid string, expireDuration time.Duration) (string, error) {
expire := time.Now().Add(expireDuration)
// 将 uid,用户角色, 过期时间作为数据写入 token 中
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
// 自定义的字段,用于之后用户信息的获取
"Uid": uid,
//系统提供的字段
//token签发日期
"iat": time.Now().Unix(),
// token过期日期
"exp": time.Now().Add(expireDuration).Unix(),
})
// SecretKey 用于对用户数据进行签名,不能暴露
return token.SignedString(jwtKey)
}
type Claims struct {
Uid string
//系统提供的字段
jwt.StandardClaims
}
func parseToken(tokenString string)(*jwt.Token, *Claims,