jwt.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package auth
  2. import (
  3. "time"
  4. "git.linuxforward.com/byom/byom-golang-lib/pkg/errors"
  5. "github.com/golang-jwt/jwt/v5"
  6. )
  7. type JWTService struct {
  8. secretKey []byte
  9. }
  10. func NewJWTService(secretKey string) *JWTService {
  11. return &JWTService{
  12. secretKey: []byte(secretKey),
  13. }
  14. }
  15. func (s *JWTService) GenerateToken(userID string, duration time.Duration) (string, error) {
  16. claims := jwt.MapClaims{
  17. "user_id": userID,
  18. "exp": time.Now().Add(duration).Unix(),
  19. "iat": time.Now().Unix(),
  20. }
  21. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  22. signedToken, err := token.SignedString(s.secretKey)
  23. if err != nil {
  24. return "", errors.NewAuthError("generate", err)
  25. }
  26. return signedToken, nil
  27. }
  28. func (s *JWTService) ValidateToken(tokenString string) (jwt.MapClaims, error) {
  29. if tokenString == "" {
  30. return nil, errors.NewAuthError("validate", errors.ErrInvalidInput)
  31. }
  32. token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
  33. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
  34. return nil, errors.NewAuthError("validate", errors.ErrInvalidInput)
  35. }
  36. return s.secretKey, nil
  37. })
  38. if err != nil {
  39. return nil, errors.NewAuthError("parse", err)
  40. }
  41. if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
  42. return claims, nil
  43. }
  44. return nil, errors.NewAuthError("validate", errors.ErrInvalidInput)
  45. }