package utl import ( "fmt" "github.com/dgrijalva/jwt-go" "time" ) type Tokenizer struct { key string // key lasts time.Duration // valid period } func NewTokenizer(key string, lasts time.Duration) *Tokenizer { return &Tokenizer{ key: key, lasts: lasts, } } func (self *Tokenizer) Gen(kvs map[string]interface{}) (string, error) { clm := jwt.MapClaims{} for k, v := range kvs { clm[k] = v } clm["exp"] = time.Now().Add(self.lasts).Unix() tok := jwt.NewWithClaims(jwt.SigningMethodHS512, clm) return tok.SignedString([]byte(self.key)) } func (self *Tokenizer) Parse(tokenstr string) (jwt.MapClaims, error) { tok, err := jwt.Parse(tokenstr, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return []byte(self.key), nil }) if err != nil { return nil, err } clm, ok := tok.Claims.(jwt.MapClaims) if !ok || !tok.Valid { return nil, err } return clm, nil }