cargo-platform/pkg/jwt/jwt.go
2026-08-16 01:40:21 +07:00

86 lines
1.8 KiB
Go

package jwt
import (
"cargo-erp-backend/internal/config"
"fmt"
"strconv"
"time"
"github.com/golang-jwt/jwt/v4"
"go.uber.org/zap"
)
type JWTinterface interface {
GenerateToken(secret string) (string, error)
VerifyToken(tokenString string) (*Claims, error)
}
type JWT struct {
Config config.ConfigInterface
Log *zap.Logger
}
func NewJWT(config config.ConfigInterface, logger *zap.Logger) JWTinterface {
return &JWT{
Config: config,
Log: logger,
}
}
type Claims struct {
UserID string `json:"uid"`
jwt.RegisteredClaims
}
func (j *JWT) GenerateToken(tokenUser string) (string, error) {
secret := fmt.Sprintf("%v", j.Config.Get("jwt.secret"))
expiry_time_string := fmt.Sprintf("%v", j.Config.Get("jwt.expiry_time"))
expiry_time, err := strconv.Atoi(expiry_time_string)
if err != nil {
return "", err
}
claims := Claims{
UserID: tokenUser,
RegisteredClaims: jwt.RegisteredClaims{
Issuer: "cargo-platform",
Subject: tokenUser,
IssuedAt: jwt.NewNumericDate(time.Now()),
ExpiresAt: jwt.NewNumericDate(
time.Now().Add(time.Duration(expiry_time) * time.Second),
),
},
}
token := jwt.NewWithClaims(
jwt.SigningMethodHS256,
claims,
)
return token.SignedString([]byte(secret))
}
func (j *JWT) VerifyToken(tokenString string) (*Claims, error) {
secret := fmt.Sprintf("%v", j.Config.Get("jwt.secret"))
token, err := jwt.ParseWithClaims(
tokenString,
&Claims{},
func(token *jwt.Token) (interface{}, error) {
if token.Method != jwt.SigningMethodHS256 {
return nil, fmt.Errorf("invalid signing method")
}
return []byte(secret), nil
},
)
if err != nil {
return nil, err
}
claims, ok := token.Claims.(*Claims)
if !ok || !token.Valid {
return nil, fmt.Errorf("invalid token")
}
return claims, nil
}