12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- package service
- import (
- "errors"
- "fmt"
- "github.com/dgrijalva/jwt-go"
- setting "icloudapp.cn/tools/config"
- "icloudapp.cn/tools/repository/redis"
- "time"
- )
- type PosterClaims struct {
- Uid int64 `json:"uid"`
- Username string `json:"username"`
- jwt.StandardClaims
- }
- 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)
-
- signed, err := token.SignedString([]byte(setting.Conf.JWTConfig.Secret))
- if cacheErr := CacheJWTToken(uid, signed); cacheErr != nil {
- return "", errors.New("token缓存失败")
- }
- return signed, err
- }
- 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 {
- return claim, err
- }
- return nil, errors.New("Invalid token.")
- }
- func RemoveJWTToken(uid int64) error {
- return redis.RedisClient.Del(JWTCacheKey(uid)).Err()
- }
- func GetJWTTokenFromRedis(uid int64) string {
- str, err := redis.RedisClient.Get(JWTCacheKey(uid)).Result()
- if err != nil {
- return ""
- }
- return str
- }
- func CacheJWTToken(uid int64, token string) error {
- return redis.RedisClient.Set(JWTCacheKey(uid), token, JWTExpireDuration()).Err()
- }
- func JWTCacheKey(uid int64) string {
- return fmt.Sprintf("%s_%s_%d", setting.Conf.JWTConfig.Prefix, "uid", uid)
- }
- func JWTExpireDuration() time.Duration {
- duration := time.Duration(setting.Conf.JWTConfig.ExpireAt) * time.Second
- return duration
- }
|