package service import ( "errors" "esauth" "esauth/pkg/repository" "math" "os" "time" "github.com/dgrijalva/jwt-go" ) const ( tokenTTL = 12 * time.Hour ) type tokenClaims struct { jwt.StandardClaims UserId int64 `json:"user_id"` } type AuthService struct { repo *repository.Repository } func NewAuthService(repo *repository.Repository) *AuthService { return &AuthService{repo: repo} } func (s *AuthService) CreateUser(user *esauth.User) (int64, error) { return s.repo.CreateUser(user) } func (s *AuthService) SaveUser(user *esauth.User) (int64, error) { return s.repo.SaveUser(user) } func (s *AuthService) GenerateToken(userId int64) (string, error) { token := jwt.NewWithClaims(jwt.SigningMethodHS256, &tokenClaims{ jwt.StandardClaims{ ExpiresAt: time.Now().Add(tokenTTL).Unix(), IssuedAt: time.Now().Unix(), }, userId, }) return token.SignedString([]byte(os.Getenv("SIGN_KEY"))) } func (s *AuthService) GenerateInfinityToken(userId int64) (string, error) { token := jwt.NewWithClaims(jwt.SigningMethodHS256, &tokenClaims{ jwt.StandardClaims{ ExpiresAt: math.MaxInt64, IssuedAt: time.Now().Unix(), }, userId, }) return token.SignedString([]byte(os.Getenv("SIGN_KEY"))) } func (s *AuthService) ParseToken(accessToken string) (int64, error) { token, err := jwt.ParseWithClaims(accessToken, &tokenClaims{}, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, errors.New("invalid signing method") } return []byte(os.Getenv("SIGN_KEY")), nil }) if err != nil { return 0, err } claims, ok := token.Claims.(*tokenClaims) if !ok { return 0, errors.New("token claims are not of type *tokenClaims") } return claims.UserId, nil }