package service import ( "errors" "fmt" "github.com/dgrijalva/jwt-go" setting "icloudapp.cn/tools/config" "icloudapp.cn/tools/repository/redis" "time" ) // PosterClaims Claims,保存用户id和nickname type PosterClaims struct { Uid int64 `json:"uid"` Username string `json:"username"` jwt.StandardClaims } // GenToken 生成token func GenJWTToken(uid int64, username string) (string, error) { C := PosterClaims{ uid, username, jwt.StandardClaims{ ExpiresAt: time.Now().Add(JWTExpireDuration()).Unix(), //设置超时时间,输出过期的时间,按照格式 Issuer: setting.Conf.JWTConfig.Project, //签发人 }, } //使用指定的签名方法创建签名对象 token := jwt.NewWithClaims(jwt.SigningMethodHS256, C) //使用指定的secret签名并获得完整的编码后的字符串token signed, err := token.SignedString([]byte(setting.Conf.JWTConfig.Secret)) if cacheErr := CacheJWTToken(uid, signed); cacheErr != nil { return "", errors.New("token缓存失败") } return signed, err } // ParseToken 验证token func ParseJWTToken(tokenString string) (*PosterClaims, error) { token, err := jwt.ParseWithClaims(tokenString, &PosterClaims{}, func(token *jwt.Token) (interface{}, error) { return []byte(setting.Conf.JWTConfig.Secret), nil }) if err != nil { return nil, err } if claim, ok := token.Claims.(*PosterClaims); ok && token.Valid { //valid:正确,有效 校验token return claim, err //返回JWT中的字段 } return nil, errors.New("Invalid token.") } // RemoveJWTToken 移除用户的token func RemoveJWTToken(uid int64) error { return redis.RedisClient.Del(JWTCacheKey(uid)).Err() } // GetJWTTokenFromRedis 获取redis中获取的jwt数据 func GetJWTTokenFromRedis(uid int64) string { str, err := redis.RedisClient.Get(JWTCacheKey(uid)).Result() if err != nil { return "" } return str } // CacheJWTToken 缓存jwt token到redis func CacheJWTToken(uid int64, token string) error { return redis.RedisClient.Set(JWTCacheKey(uid), token, JWTExpireDuration()).Err() } // JWTCacheKey 获取jwt cache key func JWTCacheKey(uid int64) string { return fmt.Sprintf("%s_%s_%d", setting.Conf.JWTConfig.Prefix, "uid", uid) } // JWTExpireDuration jwt过期时间 func JWTExpireDuration() time.Duration { duration := time.Duration(setting.Conf.JWTConfig.ExpireAt) * time.Second return duration }