Files
trading_assistant/trading_assistant_api/common/auth/jwt.go
2026-02-09 17:50:39 +08:00

58 lines
1.5 KiB
Go

package auth
import (
"errors"
"time"
"common/utils"
"common/logger"
"github.com/golang-jwt/jwt/v5"
)
func GenerateToken(userID string) (string, error) {
secret := utils.GetEnv("JWT_SECRET", "")
if secret == "" {
return "", errors.New("jwt_secret_missing")
}
ttlStr := utils.GetEnv("JWT_TTL", "24h")
ttl, err := time.ParseDuration(ttlStr)
if err != nil {
return "", err
}
issuer := utils.GetEnv("JWT_ISSUER", "trading-assistant")
now := time.Now()
claims := jwt.RegisteredClaims{
Subject: userID,
Issuer: issuer,
IssuedAt: jwt.NewNumericDate(now),
ExpiresAt: jwt.NewNumericDate(now.Add(ttl)),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
signed, err := token.SignedString([]byte(secret))
if err == nil {
logger.L().Printf("jwt generate success user=%s exp=%s", userID, claims.ExpiresAt.Time.Format(time.RFC3339))
}
return signed, err
}
func ParseToken(tokenStr string) (string, error) {
secret := utils.GetEnv("JWT_SECRET", "")
if secret == "" {
return "", errors.New("jwt_secret_missing")
}
var claims jwt.RegisteredClaims
tkn, err := jwt.ParseWithClaims(tokenStr, &claims, func(token *jwt.Token) (interface{}, error) {
return []byte(secret), nil
})
if err != nil {
logger.L().Printf("jwt parse error: %v", err)
return "", err
}
if !tkn.Valid {
logger.L().Printf("jwt invalid")
return "", errors.New("token_invalid")
}
logger.L().Printf("jwt parse success user=%s exp=%s", claims.Subject, claims.ExpiresAt.Time.Format(time.RFC3339))
return claims.Subject, nil
}