diff --git a/services/attendance-service/auth.go b/services/attendance-service/auth.go index f2ebb48..505d744 100644 --- a/services/attendance-service/auth.go +++ b/services/attendance-service/auth.go @@ -7,6 +7,13 @@ import ( "github.com/golang-jwt/jwt/v5" ) +type internalClaims struct { + jwt.RegisteredClaims + UserID string `json:"user_id"` + UserRole string `json:"user_role"` + TenantID string `json:"tenant_id"` +} + var internalJWTSecret []byte func initAuth() { @@ -28,25 +35,25 @@ func authMiddleware(c *fiber.Ctx) error { return c.Status(401).JSON(fiber.Map{"error": "Missing internal authentication"}) } - token, err := jwt.Parse(internalToken, func(token *jwt.Token) (interface{}, error) { + token, err := jwt.ParseWithClaims(internalToken, &internalClaims{}, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fiber.NewError(401, "Invalid signing method") } return internalJWTSecret, nil }) - if err != nil || !token.Valid { + if err != nil { return c.Status(401).JSON(fiber.Map{"error": "Invalid internal authentication"}) } - claims, ok := token.Claims.(jwt.MapClaims) + claims, ok := token.Claims.(*internalClaims) if !ok { return c.Status(401).JSON(fiber.Map{"error": "Invalid token claims"}) } - userID, _ := claims["user_id"].(string) - userRole, _ := claims["user_role"].(string) - tenantID, _ := claims["tenant_id"].(string) + userID := claims.UserID + userRole := claims.UserRole + tenantID := claims.TenantID if tenantID == "" { tenantID = "default" diff --git a/services/leave-service/pom.xml b/services/leave-service/pom.xml index c6443d9..ec2ed74 100644 --- a/services/leave-service/pom.xml +++ b/services/leave-service/pom.xml @@ -31,6 +31,10 @@ org.springframework.boot spring-boot-starter-amqp + + org.springframework.boot + spring-boot-starter-security + org.springframework.boot spring-boot-starter-aop diff --git a/services/lms-service/middleware/auth.go b/services/lms-service/middleware/auth.go index b01372a..fc90023 100644 --- a/services/lms-service/middleware/auth.go +++ b/services/lms-service/middleware/auth.go @@ -7,6 +7,13 @@ import ( "github.com/golang-jwt/jwt/v5" ) +type internalClaims struct { + jwt.RegisteredClaims + UserID string `json:"user_id"` + UserRole string `json:"user_role"` + TenantID string `json:"tenant_id"` +} + var internalJWTSecret []byte func InitAuth() { @@ -29,25 +36,25 @@ func AuthMiddleware() fiber.Handler { return c.Status(401).JSON(fiber.Map{"error": "Missing internal authentication"}) } - token, err := jwt.Parse(internalToken, func(token *jwt.Token) (interface{}, error) { + token, err := jwt.ParseWithClaims(internalToken, &internalClaims{}, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fiber.NewError(401, "Invalid signing method") } return internalJWTSecret, nil }) - if err != nil || !token.Valid { + if err != nil { return c.Status(401).JSON(fiber.Map{"error": "Invalid internal authentication"}) } - claims, ok := token.Claims.(jwt.MapClaims) + claims, ok := token.Claims.(*internalClaims) if !ok { return c.Status(401).JSON(fiber.Map{"error": "Invalid token claims"}) } - userID, _ := claims["user_id"].(string) - userRole, _ := claims["user_role"].(string) - tenantID, _ := claims["tenant_id"].(string) + userID := claims.UserID + userRole := claims.UserRole + tenantID := claims.TenantID if tenantID == "" { tenantID = "default" diff --git a/services/notification-go-service/main.go b/services/notification-go-service/main.go index 012c662..029cf5c 100644 --- a/services/notification-go-service/main.go +++ b/services/notification-go-service/main.go @@ -110,12 +110,22 @@ var ( mutex = &sync.Mutex{} ) -func validateJWT(tokenString string) (jwt.MapClaims, error) { +type wsClaims struct { + jwt.RegisteredClaims + TenantID string `json:"tenant_id"` +} + +type internalAuthClaims struct { + jwt.RegisteredClaims + TenantID string `json:"tenant_id"` +} + +func validateJWT(tokenString string) (*wsClaims, error) { secret := os.Getenv("JWT_SECRET") if secret == "" { return nil, fmt.Errorf("JWT_SECRET not configured") } - token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { + token, err := jwt.ParseWithClaims(tokenString, &wsClaims{}, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } @@ -124,10 +134,11 @@ func validateJWT(tokenString string) (jwt.MapClaims, error) { if err != nil { return nil, err } - if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { - return claims, nil + claims, ok := token.Claims.(*wsClaims) + if !ok { + return nil, fmt.Errorf("invalid token claims") } - return nil, fmt.Errorf("invalid token") + return claims, nil } func internalAuthMiddleware(next http.HandlerFunc) http.HandlerFunc { @@ -144,27 +155,26 @@ func internalAuthMiddleware(next http.HandlerFunc) http.HandlerFunc { return } - token, err := jwt.Parse(internalToken, func(token *jwt.Token) (interface{}, error) { + token, err := jwt.ParseWithClaims(internalToken, &internalAuthClaims{}, 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(internalKey), nil }) - if err != nil || !token.Valid { + if err != nil { http.Error(w, `{"error":"Invalid internal authentication"}`, http.StatusUnauthorized) return } - claims, ok := token.Claims.(jwt.MapClaims) + claims, ok := token.Claims.(*internalAuthClaims) if !ok { http.Error(w, `{"error":"Invalid token claims"}`, http.StatusUnauthorized) return } - tenantID, _ := claims["tenant_id"].(string) - if tenantID != "" { - r.Header.Set("X-Tenant-Id", tenantID) + if claims.TenantID != "" { + r.Header.Set("X-Tenant-Id", claims.TenantID) } next(w, r) @@ -236,7 +246,7 @@ func handleConnections(w http.ResponseWriter, r *http.Request) { return } - tenantID, _ := claims["tenant_id"].(string) + tenantID := claims.TenantID if tenantID == "" { tenantID = "default" } diff --git a/services/payroll-java-service/pom.xml b/services/payroll-java-service/pom.xml index 4a8deab..13d3066 100644 --- a/services/payroll-java-service/pom.xml +++ b/services/payroll-java-service/pom.xml @@ -38,6 +38,10 @@ org.springframework.boot spring-boot-starter-validation + + org.springframework.boot + spring-boot-starter-security + org.springframework.boot spring-boot-starter-aop diff --git a/services/performance-service/pom.xml b/services/performance-service/pom.xml index f200805..19fae3a 100644 --- a/services/performance-service/pom.xml +++ b/services/performance-service/pom.xml @@ -38,6 +38,10 @@ postgresql runtime + + org.springframework.boot + spring-boot-starter-security + org.flywaydb flyway-core