jwt.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package auth
  2. import (
  3. "time"
  4. "github.com/golang-jwt/jwt/v5"
  5. )
  6. type JWTService struct {
  7. secretKey []byte
  8. }
  9. func NewJWTService(config *Config) *JWTService {
  10. return &JWTService{
  11. secretKey: []byte(config.SecretKey),
  12. }
  13. }
  14. func (s *JWTService) GenerateToken(userID string, duration time.Duration) (string, error) {
  15. claims := jwt.MapClaims{
  16. "user_id": userID,
  17. "exp": time.Now().Add(duration).Unix(),
  18. "iat": time.Now().Unix(),
  19. }
  20. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  21. signedToken, err := token.SignedString(s.secretKey)
  22. if err != nil {
  23. return "", NewError("generate", err, "failed to sign token")
  24. }
  25. return signedToken, nil
  26. }
  27. func (s *JWTService) ValidateToken(tokenString string) (jwt.MapClaims, error) {
  28. if tokenString == "" {
  29. return nil, NewError("validate", ErrEmptyToken, "token string is empty")
  30. }
  31. token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
  32. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
  33. return nil, NewError("validate", ErrInvalidSigningMethod, "unexpected signing method")
  34. }
  35. return s.secretKey, nil
  36. })
  37. if err != nil {
  38. return nil, NewError("parse", ErrInvalidToken, err.Error())
  39. }
  40. if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
  41. return claims, nil
  42. }
  43. return nil, NewError("validate", ErrInvalidClaims, "token claims are invalid")
  44. }