package certs import ( "encoding/json" "errors" "github.com/golang-jwt/jwt/v5" "github.com/rs/xid" "time" ) type User struct { UserId int64 `json:"id"` jwt.RegisteredClaims } func NewUser() *User { return &User{} } // Token 获取token func (u *User) Token(id int64, username string) (string, error) { u.UserId = id u.RegisteredClaims = jwt.RegisteredClaims{ Issuer: issuer, Subject: username, ExpiresAt: jwt.NewNumericDate(u.Expired()), NotBefore: jwt.NewNumericDate(time.Now()), IssuedAt: jwt.NewNumericDate(time.Now()), ID: xid.New().String(), } var key = randomString(6) token := jwt.NewWithClaims(jwt.SigningMethodHS256, u) //加密校验字符串 token.Header[saltKey] = key token.Header[signKey] = mmd5(key) return token.SignedString([]byte(key)) } // Parse 解析token func (u *User) Parse(tokenString string) (err error) { token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { salt, sign, ok := checkHeaderSign(token.Header) if !ok || mmd5(salt) != sign { return nil, errors.New("key invalid") } return []byte(salt), nil }) if err != nil { return } if user, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { b, _ := json.Marshal(user) _ = json.Unmarshal(b, u) return } if errors.Is(err, jwt.ErrTokenExpired) || errors.Is(err, jwt.ErrTokenNotValidYet) { return ExpiredErr } return InvalidToken } func (u *User) Expired() time.Time { return time.Now().AddDate(0, 0, 7) }