实现步骤
1.用户登录成功后,生成JWT Token
2.把Token存入 redis
3.用户访问需要授权的信息,从Header中获取Token与Redis中Token进行对比
4.解析Token,获取到UserId
引入jwt-go 三方包
import (
" github .com/dgrijalva/jwt-go"
)
生成JWT Token
func NewToken(userId string) string { token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ constant.USER_ID: userId, "exp": time.Now().Add(constant.TimeOut). Unix (), "nbf": time.Now().Unix(), }) tokenString, err := token.SignedString([] byte (constant.KEY)) if err != nil { return "" } return tokenString }
Redis保存Token
keyUser := constant.REDIS_USER_TOKEN + "1" err3 := redis.RedisCli.Set(keyUser, token, 0).Err() if err3 != nil { panic(err3) }
Token验证
func CheckToken() gin.HandlerFunc {
return func(c *gin.Context) {
tokenStr := c. Request .Header.Get(constant.TOKEN_NAME)
token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
return []byte(constant.KEY), nil
})
if err != nil {
fmt.Println(err)
c.AbortWithStatus(http.StatusUnauthorized)
return
} else {
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
userId := claims[constant.USER_ID].(string)
//Redis 获取Token
keyUser := constant.REDIS_USER_TOKEN + userId
token, err := redis.RedisCli.Get(keyUser).Result()
if err != nil {
c.AbortWithStatus(http.StatusUnauthorized)
return
}
if strings.EqualFold(token, tokenStr) {
c.Request.Header.Set(constant.USER_ID, userId)
} else {
c.AbortWithStatus(http.StatusUnauthorized)
return
}
}
}
c.Next()
}
}
如果你觉得好,可以使用我开发的APP,已经发布到iOS APP Store
- 人脉管理
- 学习管理
- 爱背单词
- 房产管理
- 物品管理
- 团队管理
- 证书管理
- 专利管理
- 资产管理8
- 密码提示管理