1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- package auth
- import (
- "time"
- "github.com/golang-jwt/jwt/v5"
- )
- type JWTService struct {
- secretKey []byte
- }
- func NewJWTService(config *Config) *JWTService {
- return &JWTService{
- secretKey: []byte(config.SecretKey),
- }
- }
- func (s *JWTService) GenerateToken(userID string, duration time.Duration) (string, error) {
- claims := jwt.MapClaims{
- "user_id": userID,
- "exp": time.Now().Add(duration).Unix(),
- "iat": time.Now().Unix(),
- }
- token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
- signedToken, err := token.SignedString(s.secretKey)
- if err != nil {
- return "", NewError("generate", err, "failed to sign token")
- }
- return signedToken, nil
- }
- func (s *JWTService) ValidateToken(tokenString string) (jwt.MapClaims, error) {
- if tokenString == "" {
- return nil, NewError("validate", ErrEmptyToken, "token string is empty")
- }
- token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
- if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
- return nil, NewError("validate", ErrInvalidSigningMethod, "unexpected signing method")
- }
- return s.secretKey, nil
- })
- if err != nil {
- return nil, NewError("parse", ErrInvalidToken, err.Error())
- }
- if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
- return claims, nil
- }
- return nil, NewError("validate", ErrInvalidClaims, "token claims are invalid")
- }
|