package jwt import ( "errors" "time" "github.com/golang-jwt/jwt/v5" ) var ( // ErrTokenExpired token 已过期 ErrTokenExpired = errors.New("token已过期") // ErrTokenInvalid token 无效 ErrTokenInvalid = errors.New("token无效") ) // JWT JWT工具 type JWT struct { secretKey []byte expiresIn time.Duration } // NewJWT 创建JWT实例 func NewJWT(secretKey string, expiresIn time.Duration) *JWT { return &JWT{ secretKey: []byte(secretKey), expiresIn: expiresIn, } } // GenerateToken 生成token func (j *JWT) GenerateToken(claims jwt.Claims) (string, error) { token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(j.secretKey) } // ParseToken 解析token func (j *JWT) ParseToken(tokenString string, claims jwt.Claims) error { token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, errors.New("unexpected signing method") } return j.secretKey, nil }) if err != nil { if errors.Is(err, jwt.ErrTokenExpired) { return ErrTokenExpired } return ErrTokenInvalid } if !token.Valid { return ErrTokenInvalid } return nil }