gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/myx/tokenutil/token-do.go (about)

     1  package tokenutil
     2  
     3  import (
     4  	"gitee.com/zhongguo168a/gocodes/datax/mapx"
     5  	"github.com/dgrijalva/jwt-go"
     6  	"github.com/pkg/errors"
     7  	"time"
     8  )
     9  
    10  var (
    11  	ErrParseFail   = errors.New("token parse fail")
    12  	ErrIllegal     = errors.New("token invalid")
    13  	ErrExpired     = errors.New("token expired")
    14  	ErrUseNotmatch = errors.New("token use notmatch")
    15  )
    16  
    17  // CreateLater 令牌-创建
    18  func CreateToken(info *TokenInfo, hmacSampleSecret string) (t string, err error) {
    19  	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
    20  		"uid":  info.Uid,
    21  		"role": info.Role,
    22  		"time": int(time.Now().Unix()),
    23  	})
    24  
    25  	t, err = token.SignedString([]byte(hmacSampleSecret))
    26  	if err != nil {
    27  		err = errors.Wrap(err, "signed string")
    28  		return
    29  	}
    30  
    31  	return
    32  }
    33  
    34  func ParseToken(tok, secret string) (info *TokenInfo, err error) {
    35  	t, err := jwt.Parse(tok, func(*jwt.Token) (interface{}, error) {
    36  		return []byte(secret), nil
    37  	})
    38  	if err != nil {
    39  		return nil, ErrParseFail
    40  	}
    41  	info = &TokenInfo{}
    42  	info.JwtToken = t
    43  	var tokenMap = t.Claims.(jwt.MapClaims)
    44  
    45  	info.Uid = mapx.String(tokenMap, "uid")
    46  	info.Role = mapx.String(tokenMap, "role")
    47  	info.Time = int32(mapx.Int(tokenMap, "time"))
    48  	return
    49  }
    50  
    51  // TokenInfo 令牌信息
    52  type TokenInfo struct {
    53  	// 用户id
    54  	Uid string
    55  	// 权限
    56  	Role string
    57  	//
    58  	Time int32
    59  	//
    60  	JwtToken *jwt.Token
    61  }
    62  
    63  func (info *TokenInfo) GetLogObj() (r map[string]interface{}) {
    64  	r = map[string]interface{}{}
    65  	if info == nil {
    66  		return
    67  	}
    68  	r["uid"] = info.Uid
    69  	r["role"] = info.Role
    70  	r["time"] = info.Time
    71  	return
    72  }
    73  
    74  // Valid 验证token
    75  func (info *TokenInfo) Valid(expiredTime int) (err error) {
    76  	if info.JwtToken.Valid == false {
    77  		err = ErrIllegal
    78  		return
    79  	}
    80  
    81  	if time.Now().Unix() > time.Unix(int64(info.Time), 0).Add(time.Duration(int(time.Second)*expiredTime)).Unix() {
    82  		err = ErrExpired
    83  		return
    84  	}
    85  
    86  	return
    87  }