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 6239c85caa1aeca7f4fa838df9a940e11d0907a0..6e6edce0ba5517325df77ca6c58b257f24fcb766 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 7dfa56acc48bad46f862f259c15f90b8e172ad01..0dd5aee61baade3d3da3d14c647f6f8b65108e4d 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 3e33376dd18629f48bd6863bd8beb06465455901..9f53758bd479d16346bab7845003d97500d5f1ea 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 e63522e1a8660e71573fdb018aaae5f5596517ce..0000000000000000000000000000000000000000 --- 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 0c786ec6366ae5f39d46dd5ae0d546793265e33c..d40def52cc5de07b7954d64a5a80a04a372fcd23 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 4ef2db20a9b6b3e4fa34d713c6b4b4b529b4fa33..3f992846c754e83a74d74a048719113965d090dd 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 1736439a1b93980155336707350f695a9f56c0ed..6470edf8ea5ed9987ea0f139ad8d0c240dce125f 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 d503f9193f58a44dee2a0b184ee654af4893999f..044482aa1eef6b1ac8d900730480396d8e8e63ad 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 10049fc82e340fab5885cbd523f0962fc03292f5..91c82e14c7122cd4b7931033118edfa80d8ea8af 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 03f2b6c132f4bf9531f891d34471d6484197a9dd..d9c00044d4ce773b57a53848e0b925d71484377c 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 a2a00805f914c4aa95e29e244ece3826db25796c..f49fcd0a35580ceeec1f100ced21c7240e4fbd01 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 d633043cce2da7d19a75b7bf32db38bd52905e5f..d84db0a991c8f12863dcfc7fae793f989e86160b 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 ad4a9a515522af4efcda2a87f59dc1902879136f..d701662a0eac3c5728d3b0a84d8296af696f8b60 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