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) tok := jwt.NewWithClaims(jwt.SigningMethodHS512, clm) return tok.SignedString(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 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 }