100 lines
2.4 KiB
Go
100 lines
2.4 KiB
Go
package authentication
|
|
|
|
import (
|
|
"errors"
|
|
"netina/database"
|
|
Role_repository "netina/repositories/role"
|
|
User_repository "netina/repositories/user"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/dgrijalva/jwt-go"
|
|
"github.com/joho/godotenv"
|
|
)
|
|
|
|
// JWTClaims defines the structure of JWT claims.
|
|
type JWTClaims struct {
|
|
ID uint `json:"id"`
|
|
Role string `json:"role"`
|
|
jwt.StandardClaims
|
|
}
|
|
|
|
// 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 *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) (*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, &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.(*JWTClaims); ok && token.Valid {
|
|
return claims, nil
|
|
}
|
|
|
|
return nil, errors.New("invalid token")
|
|
}
|
|
|
|
// GenerateClaims creates JWT claims.
|
|
func GenerateClaims(userID uint) (*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 := &JWTClaims{
|
|
ID: user.User_id,
|
|
Role: role.Name,
|
|
StandardClaims: jwt.StandardClaims{
|
|
ExpiresAt: time.Now().Add(time.Hour * 2).Unix(),
|
|
|
|
},
|
|
}
|
|
|
|
return cliams , nil
|
|
|
|
}
|