86 lines
1.8 KiB
Go
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
|
|
}
|