package utl import ( "fmt" "github.com/dgrijalva/jwt-go" "time" ) type Tokenizer struct { key string // key lasts time.Duration // valid period } func NewToken(key string, lasts time.Duration) *Tokenizer { return &Tokenizer{ key: key, lasts: lasts, } } func (self *Tokenizer) Gen(id uint64) (string, error) { clm := jwt.MapClaims{} clm["uid"] = id clm["exp"] = time.Now().Add(self.lasts) tok := jwt.NewWithClaims(jwt.SigningMethodHS512, clm) return tok.SignedString(self.key) } func (self *Tokenizer) Parse(tokenstr string) (uint64, 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 0, err } clm, ok := tok.Claims.(jwt.MapClaims) if !ok || !tok.Valid { return 0, err } return clm["uid"].(uint64), nil }