15357fd3c0
yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarba
61 lines
1.5 KiB
Go
61 lines
1.5 KiB
Go
// service/jwt_service.go
|
|
package service
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/golang-jwt/jwt/v5"
|
|
)
|
|
|
|
type JWTService interface {
|
|
GenerateToken(userID uint, email string) (string, error)
|
|
ValidateToken(tokenString string) (*jwt.Token, error)
|
|
ExtractUserID(token *jwt.Token) (uint, error)
|
|
}
|
|
|
|
type jwtService struct {
|
|
secretKey string
|
|
}
|
|
|
|
func NewJWTService(secretKey string) JWTService {
|
|
return &jwtService{secretKey: secretKey}
|
|
}
|
|
|
|
type Claims struct {
|
|
UserID uint `json:"user_id"`
|
|
Email string `json:"email"`
|
|
jwt.RegisteredClaims
|
|
}
|
|
|
|
func (j *jwtService) GenerateToken(userID uint, email string) (string, error) {
|
|
claims := &Claims{
|
|
UserID: userID,
|
|
Email: email,
|
|
RegisteredClaims: jwt.RegisteredClaims{
|
|
ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)),
|
|
IssuedAt: jwt.NewNumericDate(time.Now()),
|
|
},
|
|
}
|
|
|
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|
return token.SignedString([]byte(j.secretKey))
|
|
}
|
|
|
|
func (j *jwtService) ValidateToken(tokenString string) (*jwt.Token, error) {
|
|
return jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
|
|
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
|
|
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
|
|
}
|
|
return []byte(j.secretKey), nil
|
|
})
|
|
}
|
|
|
|
func (j *jwtService) ExtractUserID(token *jwt.Token) (uint, error) {
|
|
claims, ok := token.Claims.(*Claims)
|
|
if !ok {
|
|
return 0, errors.New("invalid token claims")
|
|
}
|
|
return claims.UserID, nil
|
|
} |