package auth import ( "time" "github.com/golang-jwt/jwt/v5" ) type JWTService struct { secretKey []byte } func NewJWTService(config *Config) *JWTService { return &JWTService{ secretKey: []byte(config.SecretKey), } } func (s *JWTService) GenerateToken(userID string, duration time.Duration) (string, error) { claims := jwt.MapClaims{ "user_id": userID, "exp": time.Now().Add(duration).Unix(), "iat": time.Now().Unix(), } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) signedToken, err := token.SignedString(s.secretKey) if err != nil { return "", NewError("generate", err, "failed to sign token") } return signedToken, nil } func (s *JWTService) ValidateToken(tokenString string) (jwt.MapClaims, error) { if tokenString == "" { return nil, NewError("validate", ErrEmptyToken, "token string is empty") } token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, NewError("validate", ErrInvalidSigningMethod, "unexpected signing method") } return s.secretKey, nil }) if err != nil { return nil, NewError("parse", ErrInvalidToken, err.Error()) } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return claims, nil } return nil, NewError("validate", ErrInvalidClaims, "token claims are invalid") }