Hub-Api/services/authentication/jwt.go

95 lines
2.3 KiB
Go

package authentication
import (
"errors"
"netina/database"
Role_repository "netina/repositories/role"
User_repository "netina/repositories/user"
"os"
"time"
"netina/models"
"github.com/dgrijalva/jwt-go"
"github.com/joho/godotenv"
)
// Load the environment variables from the .env file
func loadEnv() {
err := godotenv.Load("./config/.env")
if err != nil {
panic("Error loading .env file")
}
}
// GenerateJWT generates a new JWT token.
func GenerateJWT(claims *models.JWTClaims) (string, error) {
loadEnv()
secretKey := os.Getenv("SECRET_KEY")
if secretKey == "" {
return "", errors.New("SECRET_KEY is not set in the environment variables")
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err := token.SignedString([]byte(secretKey))
if err != nil {
return "", err
}
return tokenString, nil
}
// ValidateJWT validates a given JWT token.
func ValidateJWT(tokenString string) (*models.JWTClaims, error) {
loadEnv()
secretKey := os.Getenv("SECRET_KEY")
if secretKey == "" {
return nil, errors.New("SECRET_KEY is not set in the environment variables")
}
token, err := jwt.ParseWithClaims(tokenString, &models.JWTClaims{}, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, errors.New("unexpected signing method")
}
return []byte(secretKey), nil
})
if err != nil {
return nil, err
}
if claims, ok := token.Claims.(*models.JWTClaims); ok && token.Valid {
return claims, nil
}
return nil, errors.New("invalid token")
}
// GenerateClaims creates JWT claims.
func GenerateClaims(userID uint) (*models.JWTClaims , error) {
db := database.Db()
role_query := Role_repository.RoleQueryRepository{DB: &db}
user_query := User_repository.UserQueryRepository{DB: &db}
user , err := user_query.GetUser(userID)
if err != nil {
return nil , err
}
role , err := role_query.GetRole(user.Role_id)
if err != nil {
return nil , err
}
cliams := &models.JWTClaims{
ID: user.User_id,
Role: role.Name,
StandardClaims: jwt.StandardClaims{
ExpiresAt: time.Now().Add(time.Hour * 2).Unix(),
},
}
return cliams , nil
}