package auth import ( "time" "git.linuxforward.com/byom/byom-golang-lib/pkg/errors" "github.com/golang-jwt/jwt/v5" ) type JWTService struct { secretKey []byte } func NewJWTService(secretKey string) *JWTService { return &JWTService{ secretKey: []byte(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 "", errors.NewAuthError("generate", err) } return signedToken, nil } func (s *JWTService) ValidateToken(tokenString string) (jwt.MapClaims, error) { if tokenString == "" { return nil, errors.NewAuthError("validate", errors.ErrInvalidInput) } token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, errors.NewAuthError("validate", errors.ErrInvalidInput) } return s.secretKey, nil }) if err != nil { return nil, errors.NewAuthError("parse", err) } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return claims, nil } return nil, errors.NewAuthError("validate", errors.ErrInvalidInput) }