duidui_fiber/pkg/jwt/jwt.go
2026-03-27 10:34:03 +08:00

59 lines
1.2 KiB
Go

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
}