From de09a3bd587078c9706ac4e7f6065ff1270c55de Mon Sep 17 00:00:00 2001
From: hugcubi <hugo.cubino@estudiantes.uva.es>
Date: Tue, 24 Dec 2024 13:01:17 +0100
Subject: [PATCH] Ligeros reajustes

---
 .../com/uva/authentication/api/UserAPI.java   |  4 +--
 .../controllers/AuthController.java           |  7 ++--
 .../controllers/TokenController.java          |  4 +--
 .../authentication/models/TokenRequest.java   | 16 ---------
 .../models/{ => auth}/LoginRequest.java       |  2 +-
 .../models/{ => auth}/RegisterRequest.java    |  2 +-
 .../models/{ => jwt}/JwtAuth.java             |  2 +-
 .../{TokenData.java => jwt/JwtData.java}      | 33 ++++++++++++++-----
 .../authentication/models/remote/User.java    |  2 +-
 .../authentication/services/AuthService.java  | 13 ++++----
 .../authentication/services/TokenService.java |  6 ++--
 .../com/uva/authentication/utils/JwtUtil.java | 15 +++++----
 .../src/main/resources/application.properties |  7 ++--
 13 files changed, 59 insertions(+), 54 deletions(-)
 delete mode 100644 java/services/auth/src/main/java/com/uva/authentication/models/TokenRequest.java
 rename java/services/auth/src/main/java/com/uva/authentication/models/{ => auth}/LoginRequest.java (87%)
 rename java/services/auth/src/main/java/com/uva/authentication/models/{ => auth}/RegisterRequest.java (89%)
 rename java/services/auth/src/main/java/com/uva/authentication/models/{ => jwt}/JwtAuth.java (84%)
 rename java/services/auth/src/main/java/com/uva/authentication/models/{TokenData.java => jwt/JwtData.java} (50%)

diff --git a/java/services/auth/src/main/java/com/uva/authentication/api/UserAPI.java b/java/services/auth/src/main/java/com/uva/authentication/api/UserAPI.java
index 6239c85..6e6edce 100644
--- a/java/services/auth/src/main/java/com/uva/authentication/api/UserAPI.java
+++ b/java/services/auth/src/main/java/com/uva/authentication/api/UserAPI.java
@@ -11,7 +11,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.client.HttpClientErrorException;
 import org.springframework.web.client.RestTemplate;
 
-import com.uva.authentication.models.RegisterRequest;
+import com.uva.authentication.models.auth.RegisterRequest;
 import com.uva.authentication.models.remote.User;
 
 @Component
@@ -20,7 +20,7 @@ public class UserAPI {
   @Autowired
   private RestTemplate restTemplate;
 
-  @Value("${external.services.users.url}")
+  @Value("${services.external.users.url}")
   private String USER_API_URL;
 
   /**
diff --git a/java/services/auth/src/main/java/com/uva/authentication/controllers/AuthController.java b/java/services/auth/src/main/java/com/uva/authentication/controllers/AuthController.java
index 7dfa56a..0dd5aee 100644
--- a/java/services/auth/src/main/java/com/uva/authentication/controllers/AuthController.java
+++ b/java/services/auth/src/main/java/com/uva/authentication/controllers/AuthController.java
@@ -8,7 +8,8 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.client.HttpClientErrorException;
 
-import com.uva.authentication.models.*;
+import com.uva.authentication.models.auth.LoginRequest;
+import com.uva.authentication.models.auth.RegisterRequest;
 import com.uva.authentication.services.AuthService;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -47,7 +48,7 @@ public class AuthController {
 
     @PostMapping("/password")
     public ResponseEntity<?> changePassword(@RequestBody Map<String, String> json,
-            @RequestHeader(value = "Authorization", required = false) String authorization) {
+            @RequestHeader(value = "Authorization", required = true) String authorization) {
         if (authorization == null || !authorization.startsWith("Bearer "))
             return new ResponseEntity<>(HttpStatus.FORBIDDEN);
 
@@ -61,7 +62,7 @@ public class AuthController {
 
     @PostMapping("/delete/{id}")
     public Object postMethodName(@PathVariable int id, @RequestBody Map<String, String> json,
-            @RequestHeader(value = "Authorization", required = false) String authorization) {
+            @RequestHeader(value = "Authorization", required = true) String authorization) {
         if (authorization == null || !authorization.startsWith("Bearer "))
             return new ResponseEntity<>(HttpStatus.FORBIDDEN);
 
diff --git a/java/services/auth/src/main/java/com/uva/authentication/controllers/TokenController.java b/java/services/auth/src/main/java/com/uva/authentication/controllers/TokenController.java
index 3e33376..9f53758 100644
--- a/java/services/auth/src/main/java/com/uva/authentication/controllers/TokenController.java
+++ b/java/services/auth/src/main/java/com/uva/authentication/controllers/TokenController.java
@@ -9,11 +9,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.uva.authentication.models.JwtAuth;
+import com.uva.authentication.models.jwt.JwtAuth;
 import com.uva.authentication.services.TokenService;
 
 @RestController
-@RequestMapping("/token")
+@RequestMapping("token")
 public class TokenController {
 
   @Autowired
diff --git a/java/services/auth/src/main/java/com/uva/authentication/models/TokenRequest.java b/java/services/auth/src/main/java/com/uva/authentication/models/TokenRequest.java
deleted file mode 100644
index e63522e..0000000
--- a/java/services/auth/src/main/java/com/uva/authentication/models/TokenRequest.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.uva.authentication.models;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-@Getter
-@Setter
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class TokenRequest {
-  private String token;
-}
diff --git a/java/services/auth/src/main/java/com/uva/authentication/models/LoginRequest.java b/java/services/auth/src/main/java/com/uva/authentication/models/auth/LoginRequest.java
similarity index 87%
rename from java/services/auth/src/main/java/com/uva/authentication/models/LoginRequest.java
rename to java/services/auth/src/main/java/com/uva/authentication/models/auth/LoginRequest.java
index 0c786ec..d40def5 100644
--- a/java/services/auth/src/main/java/com/uva/authentication/models/LoginRequest.java
+++ b/java/services/auth/src/main/java/com/uva/authentication/models/auth/LoginRequest.java
@@ -1,4 +1,4 @@
-package com.uva.authentication.models;
+package com.uva.authentication.models.auth;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
diff --git a/java/services/auth/src/main/java/com/uva/authentication/models/RegisterRequest.java b/java/services/auth/src/main/java/com/uva/authentication/models/auth/RegisterRequest.java
similarity index 89%
rename from java/services/auth/src/main/java/com/uva/authentication/models/RegisterRequest.java
rename to java/services/auth/src/main/java/com/uva/authentication/models/auth/RegisterRequest.java
index 4ef2db2..3f99284 100644
--- a/java/services/auth/src/main/java/com/uva/authentication/models/RegisterRequest.java
+++ b/java/services/auth/src/main/java/com/uva/authentication/models/auth/RegisterRequest.java
@@ -1,4 +1,4 @@
-package com.uva.authentication.models;
+package com.uva.authentication.models.auth;
 
 import com.uva.authentication.models.remote.UserRol;
 
diff --git a/java/services/auth/src/main/java/com/uva/authentication/models/JwtAuth.java b/java/services/auth/src/main/java/com/uva/authentication/models/jwt/JwtAuth.java
similarity index 84%
rename from java/services/auth/src/main/java/com/uva/authentication/models/JwtAuth.java
rename to java/services/auth/src/main/java/com/uva/authentication/models/jwt/JwtAuth.java
index 1736439..6470edf 100644
--- a/java/services/auth/src/main/java/com/uva/authentication/models/JwtAuth.java
+++ b/java/services/auth/src/main/java/com/uva/authentication/models/jwt/JwtAuth.java
@@ -1,4 +1,4 @@
-package com.uva.authentication.models;
+package com.uva.authentication.models.jwt;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
diff --git a/java/services/auth/src/main/java/com/uva/authentication/models/TokenData.java b/java/services/auth/src/main/java/com/uva/authentication/models/jwt/JwtData.java
similarity index 50%
rename from java/services/auth/src/main/java/com/uva/authentication/models/TokenData.java
rename to java/services/auth/src/main/java/com/uva/authentication/models/jwt/JwtData.java
index d503f91..044482a 100644
--- a/java/services/auth/src/main/java/com/uva/authentication/models/TokenData.java
+++ b/java/services/auth/src/main/java/com/uva/authentication/models/jwt/JwtData.java
@@ -1,55 +1,72 @@
-package com.uva.authentication.models;
+package com.uva.authentication.models.jwt;
 
 import java.lang.reflect.Field;
+import java.util.Date;
 
 import com.auth0.jwt.interfaces.Claim;
 import com.auth0.jwt.interfaces.DecodedJWT;
+import com.uva.authentication.models.remote.UserRol;
 
 import lombok.Data;
 import lombok.Getter;
 import lombok.Setter;
+import lombok.ToString;
 
 @Getter
 @Setter
 @Data
-public class TokenData {
+@ToString
+public class JwtData {
   private Integer id;
   private String name;
   private String email;
-  private String rol;
+  private UserRol rol;
   private String service;
 
   private String subject;
   private String audience;
   private Long ttl;
 
-  public TokenData(DecodedJWT decoded, long ttl) {
+  private Date issuedAt;
+  private Date expiresAt;
+
+  public JwtData(DecodedJWT decoded, long ttl) {
 
     subject = decoded.getSubject();
-    audience = decoded.getAudience().get(0);
+    if (decoded.getAudience() != null && !decoded.getAudience().isEmpty())
+      audience = decoded.getAudience().get(0);
     this.ttl = ttl;
+    issuedAt = decoded.getIssuedAt();
+    expiresAt = decoded.getExpiresAt();
 
     for (Field field : this.getClass().getDeclaredFields()) {
       field.setAccessible(true);
 
       // Verificamos si el campo está en el mapa y asignamos el valor
       Claim claim = decoded.getClaim(field.getName());
-      if (!claim.isMissing()) {
+      System.out.println(field.getName() + " => " + claim.isMissing() + " " + claim.isNull() + " " + claim.asString()
+          + " " + decoded.getClaim("rol").asString());
+      if (!claim.isNull()) {
+        String value = claim.asString();
         try {
           // Dependiendo del tipo de campo, asignamos el valor
           if (field.getType() == Integer.class) {
-            field.set(this, Integer.parseInt(claim.asString()));
+            field.set(this, claim.asInt());
           } else if (field.getType() == String.class) {
             field.set(this, claim.asString());
+          } else if (field.getType() == UserRol.class) {
+            if (value != null)
+              field.set(this, UserRol.valueOf(value));
           }
         } catch (IllegalAccessException e) {
           e.printStackTrace();
         }
       }
     }
+    System.out.println("\n\n\n<-- " + this + " -->");
   }
 
   public boolean isAdmin() {
-    return rol != null && rol == "ADMIN";
+    return rol != null && rol == UserRol.ADMIN;
   }
 }
\ No newline at end of file
diff --git a/java/services/auth/src/main/java/com/uva/authentication/models/remote/User.java b/java/services/auth/src/main/java/com/uva/authentication/models/remote/User.java
index 10049fc..91c82e1 100644
--- a/java/services/auth/src/main/java/com/uva/authentication/models/remote/User.java
+++ b/java/services/auth/src/main/java/com/uva/authentication/models/remote/User.java
@@ -1,6 +1,6 @@
 package com.uva.authentication.models.remote;
 
-import com.uva.authentication.models.RegisterRequest;
+import com.uva.authentication.models.auth.RegisterRequest;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/java/services/auth/src/main/java/com/uva/authentication/services/AuthService.java b/java/services/auth/src/main/java/com/uva/authentication/services/AuthService.java
index 03f2b6c..d9c0004 100644
--- a/java/services/auth/src/main/java/com/uva/authentication/services/AuthService.java
+++ b/java/services/auth/src/main/java/com/uva/authentication/services/AuthService.java
@@ -6,13 +6,12 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.HttpClientErrorException;
-import org.springframework.web.servlet.function.EntityResponse;
 
 import com.uva.authentication.api.UserAPI;
-import com.uva.authentication.models.JwtAuth;
-import com.uva.authentication.models.LoginRequest;
-import com.uva.authentication.models.RegisterRequest;
-import com.uva.authentication.models.TokenData;
+import com.uva.authentication.models.auth.LoginRequest;
+import com.uva.authentication.models.auth.RegisterRequest;
+import com.uva.authentication.models.jwt.JwtAuth;
+import com.uva.authentication.models.jwt.JwtData;
 import com.uva.authentication.models.remote.User;
 import com.uva.authentication.utils.JwtUtil;
 import com.uva.authentication.utils.SecurityUtils;
@@ -78,7 +77,7 @@ public class AuthService {
   }
 
   public ResponseEntity<?> changePassword(String token, String actualPass, String newPass) {
-    TokenData decoded = jwtUtil.decodeToken(token);
+    JwtData decoded = jwtUtil.decodeToken(token);
     if (decoded == null)
       return new ResponseEntity<>(HttpStatus.FORBIDDEN);
 
@@ -102,7 +101,7 @@ public class AuthService {
   }
 
   public ResponseEntity<?> deleteUser(String token, int id, String password) {
-    TokenData decoded = jwtUtil.decodeToken(token);
+    JwtData decoded = jwtUtil.decodeToken(token);
     if (decoded == null)
       return new ResponseEntity<>(HttpStatus.FORBIDDEN);
 
diff --git a/java/services/auth/src/main/java/com/uva/authentication/services/TokenService.java b/java/services/auth/src/main/java/com/uva/authentication/services/TokenService.java
index a2a0080..f49fcd0 100644
--- a/java/services/auth/src/main/java/com/uva/authentication/services/TokenService.java
+++ b/java/services/auth/src/main/java/com/uva/authentication/services/TokenService.java
@@ -5,8 +5,8 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 
-import com.uva.authentication.models.JwtAuth;
-import com.uva.authentication.models.TokenData;
+import com.uva.authentication.models.jwt.JwtAuth;
+import com.uva.authentication.models.jwt.JwtData;
 import com.uva.authentication.utils.JwtUtil;
 
 @Service
@@ -27,7 +27,7 @@ public class TokenService {
   }
 
   public ResponseEntity<?> getTokenInf(String token) {
-    TokenData decoded = jwtUtil.decodeToken(token);
+    JwtData decoded = jwtUtil.decodeToken(token);
     if (decoded == null)
       return new ResponseEntity<>("Token has expire or is malformed", HttpStatus.FORBIDDEN);
     return ResponseEntity.ok(decoded);
diff --git a/java/services/auth/src/main/java/com/uva/authentication/utils/JwtUtil.java b/java/services/auth/src/main/java/com/uva/authentication/utils/JwtUtil.java
index d633043..d84db0a 100644
--- a/java/services/auth/src/main/java/com/uva/authentication/utils/JwtUtil.java
+++ b/java/services/auth/src/main/java/com/uva/authentication/utils/JwtUtil.java
@@ -8,7 +8,7 @@ import org.springframework.web.client.HttpClientErrorException;
 
 import com.auth0.jwt.JWT;
 import com.auth0.jwt.algorithms.Algorithm;
-import com.uva.authentication.models.TokenData;
+import com.uva.authentication.models.jwt.JwtData;
 import com.uva.authentication.models.remote.User;
 
 import com.auth0.jwt.interfaces.DecodedJWT;
@@ -32,14 +32,15 @@ public class JwtUtil {
 
   private String token;
 
-  private static final String SERVICE = "AUTH_SERVICES";
+  @Value("${spring.application.name}")
+  private String service;
 
   public String getOwnInternalToken() {
 
     // Si no hay token, no es valido o quedan 10 seg para caducar se genera otro
     if (token == null || validate(token) == null ||
         decodeToken(token).getTtl() <= 10) {
-      token = generateInternalToken(SERVICE);
+      token = generateInternalToken(service);
     }
 
     return token;
@@ -70,6 +71,8 @@ public class JwtUtil {
   public String generateToken(User user) {
     Algorithm algorithm = Algorithm.HMAC256(secretKey);
 
+    System.out.println("\n\n<-- " + user + " " + user.getId() + " -->");
+
     return JWT
         .create()
 
@@ -77,7 +80,7 @@ public class JwtUtil {
         .withIssuedAt(new Date())
         .withExpiresAt(new Date(System.currentTimeMillis() + extJwtExpiration * 1000))
 
-        .withSubject(SERVICE)
+        .withSubject(service)
         .withAudience("EXTERNAL")
 
         // DATA
@@ -97,11 +100,11 @@ public class JwtUtil {
     }
   }
 
-  public TokenData decodeToken(String token) {
+  public JwtData decodeToken(String token) {
     DecodedJWT decoded = validate(token);
     if (decoded == null)
       return null;
-    return new TokenData(decoded, calculateTTL(decoded));
+    return new JwtData(decoded, calculateTTL(decoded));
   }
 
   private long calculateTTL(DecodedJWT decodedJWT) {
diff --git a/java/services/auth/src/main/resources/application.properties b/java/services/auth/src/main/resources/application.properties
index ad4a9a5..d701662 100644
--- a/java/services/auth/src/main/resources/application.properties
+++ b/java/services/auth/src/main/resources/application.properties
@@ -2,9 +2,10 @@ spring.application.name=authService
 server.port=8101
 
 security.jwt.secret-key=MiClaveDeSeguridadMuyLargaParaQueNoFalleSpringBoot
-# 1h in millisecond
+# 1h in seconds
 security.jwt.external.expiration=3600 
-security.jwt.internal.expiration=20
+# 10min in seconds
+security.jwt.internal.expiration=600
 security.jwt.kid=cYz3kNRLAirxVhHXQ5rh5xKrOwHwZVui
 
-external.services.users.url=http://localhost:8201/users
\ No newline at end of file
+services.external.users.url=http://localhost:8201/users
\ No newline at end of file
-- 
GitLab