diff --git a/java/services/bookings/src/main/java/com/uva/api/bookings/api/TokenAPI.java b/java/services/bookings/src/main/java/com/uva/api/bookings/api/TokenAPI.java
index 8dd8237326b628627a99fee9c0b1c063eda4b30a..9e2271dc71ff2181d2f1898481261b484046fdeb 100644
--- a/java/services/bookings/src/main/java/com/uva/api/bookings/api/TokenAPI.java
+++ b/java/services/bookings/src/main/java/com/uva/api/bookings/api/TokenAPI.java
@@ -9,7 +9,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.client.RestTemplate;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.uva.api.bookings.models.external.JwtData;
+import com.uva.api.bookings.models.external.jwt.JwtData;
 
 @Component
 public class TokenAPI {
diff --git a/java/services/bookings/src/main/java/com/uva/api/bookings/config/MyScheduledTasks.java b/java/services/bookings/src/main/java/com/uva/api/bookings/config/MyScheduledTasks.java
index d289884370dc1500c9255b861d1c5d767ebc1c9a..0b8843c05e876c9bcba5378981b23a1ee7299b50 100644
--- a/java/services/bookings/src/main/java/com/uva/api/bookings/config/MyScheduledTasks.java
+++ b/java/services/bookings/src/main/java/com/uva/api/bookings/config/MyScheduledTasks.java
@@ -12,7 +12,7 @@ public class MyScheduledTasks {
   @Autowired
   private BookingService bookingService;
 
-  @Scheduled(cron = "0 30 0 * * *") // Se ejecuta cada día a medianoche
+  @Scheduled(cron = "0 30 0 * * *") // Se ejecuta cada día media hora después de medianoche
   public void updateInactiveBookings() {
     System.out.println(
         "Iniciando proceso de actualizar comunicación de cambio de estado para usuarios cuyas reservas finalizaron el dia de hoy");
@@ -20,6 +20,6 @@ public class MyScheduledTasks {
     long updatedUsers = bookingService.performDailyClientsStateUpdate();
     long time = System.currentTimeMillis() - start;
 
-    System.out.println(updatedUsers + " clients updated in " + time + " ml");
+    System.out.println("Task Complete! " + updatedUsers + " clients updated in " + time + " ms");
   }
 }
\ No newline at end of file
diff --git a/java/services/bookings/src/main/java/com/uva/api/bookings/config/SecurityConfig.java b/java/services/bookings/src/main/java/com/uva/api/bookings/config/SecurityConfig.java
index 1720a0e86ef53248b85d064a2fb559cb18eb21f0..9bd46e972889c4cd425281a2308c80e08c85ef12 100644
--- a/java/services/bookings/src/main/java/com/uva/api/bookings/config/SecurityConfig.java
+++ b/java/services/bookings/src/main/java/com/uva/api/bookings/config/SecurityConfig.java
@@ -2,14 +2,16 @@ package com.uva.api.bookings.config;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.http.HttpMethod;
+import static org.springframework.http.HttpMethod.*;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.web.SecurityFilterChain;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 
 import com.uva.api.bookings.filter.JwtAuthenticationFilter;
+import com.uva.api.bookings.models.external.jwt.Service;
 import com.uva.api.bookings.models.external.users.UserRol;
+import static com.uva.api.bookings.models.external.users.UserRol.*;
 
 @Configuration
 @EnableWebSecurity
@@ -21,34 +23,60 @@ public class SecurityConfig {
     this.jwtAuthenticationFilter = jwtAuthenticationFilter;
   }
 
+  private final String[] SERVICES = flat(Service.values());
+
+  private String[] flat(UserRol... roles) {
+    return java.util.Arrays.stream(roles)
+        .map(Enum::toString)
+        .map(role -> String.format("ROLE_%s", role))
+        .toArray(String[]::new);
+  }
+
+  private String[] flat(Service... services) {
+    return java.util.Arrays.stream(services)
+        .map(Enum::toString)
+        .toArray(String[]::new);
+  }
+
+  private String[] join(String[]... authority) {
+    return java.util.Arrays.stream(authority)
+        .flatMap(java.util.Arrays::stream)
+        .toArray(String[]::new);
+  }
+
+  /**
+   * All services and specified roles
+   * 
+   * @param roles
+   * @return
+   */
+  private String[] anyService(UserRol... roles) {
+    return join(flat(roles), SERVICES);
+  }
+
   @Bean
   SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
-    http.csrf(csrf -> csrf.disable());
-    // .authorizeHttpRequests(authorize -> authorize
-    // // Permitir OPTIONS sin autenticación
-    // .requestMatchers(HttpMethod.OPTIONS, "/**").permitAll()
-    // // Acceso restringido a usuarios y administradores
-    // .requestMatchers("users", "users/**").hasAnyRole(
-    // UserRol.CLIENT.toString(),
-    // UserRol.HOTEL_ADMIN.toString(),
-    // UserRol.ADMIN.toString())
-    // // Acceso restringido a gestores de hoteles y administradores
-    // .requestMatchers(HttpMethod.GET, "hotels", "hotels/*").hasAnyRole(
-    // UserRol.CLIENT.toString(),
-    // UserRol.HOTEL_ADMIN.toString(),
-    // UserRol.ADMIN.toString())
-
-    // .requestMatchers("hotels", "hotels/**")
-    // .hasAnyRole(UserRol.ADMIN.toString(), UserRol.HOTEL_ADMIN.toString())
-    // // Acceso restringido a cualquier usuario del sistema
-    // .requestMatchers("bookings", "bookings/**")
-    // .hasAnyRole(UserRol.ADMIN.toString(), UserRol.HOTEL_ADMIN.toString(),
-    // UserRol.CLIENT.toString())
-    // // Rechazar el resto
-    // .anyRequest().denyAll())
-    // // Registra el filtro antes del filtro estándar de autenticación
-    // .addFilterBefore(jwtAuthenticationFilter,
-    // UsernamePasswordAuthenticationFilter.class);
+    http.csrf(csrf -> csrf.disable())
+        .authorizeHttpRequests(authorize -> authorize
+            // Permitir OPTIONS sin autenticación
+            .requestMatchers(OPTIONS, "/**").permitAll()
+            // Restring acceso
+            .requestMatchers(GET, "/bookings*").authenticated()
+
+            .requestMatchers(POST, "/bookings*")
+            .hasAnyAuthority(flat(ADMIN, CLIENT))
+
+            .requestMatchers(DELETE, "/bookings*")
+            .hasAnyAuthority(anyService(ADMIN))
+
+            .requestMatchers("/bookings/**")
+            .hasAnyAuthority(anyService(ADMIN, CLIENT))
+
+            // Rechazar el resto
+            .anyRequest().denyAll())
+        // Registra el filtro antes del filtro estándar de autenticación
+        .addFilterBefore(jwtAuthenticationFilter,
+            UsernamePasswordAuthenticationFilter.class);
 
     return http.build();
   }
diff --git a/java/services/bookings/src/main/java/com/uva/api/bookings/controllers/BookingController.java b/java/services/bookings/src/main/java/com/uva/api/bookings/controllers/BookingController.java
index d0d965a9b777ac8cf7908180833db81b88416289..d3cfc7d56df8c9f321b63cd2e511d1a86ee94a43 100644
--- a/java/services/bookings/src/main/java/com/uva/api/bookings/controllers/BookingController.java
+++ b/java/services/bookings/src/main/java/com/uva/api/bookings/controllers/BookingController.java
@@ -6,10 +6,9 @@ import org.springframework.web.bind.annotation.*;
 
 import com.uva.api.bookings.models.Booking;
 import com.uva.api.bookings.services.BookingService;
+import com.uva.api.bookings.utils.Utils;
 
 import java.time.LocalDate;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 
 @RestController
 @RequestMapping("/bookings")
@@ -21,13 +20,15 @@ public class BookingController {
 
     @GetMapping
     public ResponseEntity<?> getAllBookings(
+            @RequestHeader(value = "Authorization", required = true) String authorization,
             @RequestParam(required = false) LocalDate start,
             @RequestParam(required = false) LocalDate end,
             @RequestParam(required = false) Integer hotelId,
             @RequestParam(required = false) Integer roomId,
             @RequestParam(required = false) Integer userId,
             @RequestParam(required = false) Integer managerId) {
-        return bookingService.getBookings(start, end, hotelId, roomId, userId, managerId);
+        String token = Utils.getToken(authorization);
+        return bookingService.getBookings(token, start, end, hotelId, roomId, userId, managerId);
     }
 
     @PostMapping
@@ -35,11 +36,6 @@ public class BookingController {
         return bookingService.createBooking(booking);
     }
 
-    @GetMapping("/{id:\\d+}")
-    public ResponseEntity<?> getBookingById(@PathVariable Integer id) {
-        return bookingService.getBookingById(id);
-    }
-
     @DeleteMapping
     public ResponseEntity<?> deleteBooking(
             @RequestParam(required = false) Integer hotelId,
@@ -48,8 +44,19 @@ public class BookingController {
         return bookingService.deleteBookings(hotelId, managerId, userId);
     }
 
+    @GetMapping("/{id:\\d+}")
+    public ResponseEntity<?> getBookingById(
+            @RequestHeader(value = "Authorization", required = true) String authorization,
+            @PathVariable Integer id) {
+        String token = Utils.getToken(authorization);
+        return bookingService.getBookingById(token, id);
+    }
+
     @DeleteMapping("/{id:\\d+}")
-    public ResponseEntity<?> deleteBooking(@PathVariable Integer id) {
-        return bookingService.deleteBooking(id);
+    public ResponseEntity<?> deleteBooking(
+            @RequestHeader(value = "Authorization", required = true) String authorization,
+            @PathVariable Integer id) {
+        String token = Utils.getToken(authorization);
+        return bookingService.deleteBooking(token, id);
     }
 }
diff --git a/java/services/bookings/src/main/java/com/uva/api/bookings/filter/JwtAuthenticationFilter.java b/java/services/bookings/src/main/java/com/uva/api/bookings/filter/JwtAuthenticationFilter.java
index 40f3b976ab10e18eada94cc231b38fd9cd29ec4a..289df8b658e4bf31adcc279ee9610228f24bfc40 100644
--- a/java/services/bookings/src/main/java/com/uva/api/bookings/filter/JwtAuthenticationFilter.java
+++ b/java/services/bookings/src/main/java/com/uva/api/bookings/filter/JwtAuthenticationFilter.java
@@ -1,14 +1,14 @@
 package com.uva.api.bookings.filter;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
 import org.springframework.stereotype.Component;
 
-import com.uva.api.bookings.models.external.JwtData;
+import com.uva.api.bookings.models.external.jwt.JwtData;
+import com.uva.api.bookings.models.external.jwt.Service;
 import com.uva.api.bookings.models.external.users.UserRol;
 import com.uva.api.bookings.services.TokenService;
 
@@ -42,16 +42,12 @@ public class JwtAuthenticationFilter implements Filter {
             return service.decodeToken(token);
         } catch (Exception ex) {
             System.err.println(
-                    "[" + LocalDateTime.now().toString() + "] Error de verificación del token");
+                    "[" + LocalDateTime.now().toString() + "] Error de verificación del token\n");
             ex.printStackTrace(System.err);
             return null;
         }
     }
 
-    private String formatRole(UserRol rol) {
-        return String.format("ROLE_%s", rol.toString());
-    }
-
     @Override
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
             throws IOException, ServletException {
@@ -59,38 +55,46 @@ public class JwtAuthenticationFilter implements Filter {
         HttpServletRequest httpRequest = (HttpServletRequest) request;
         String token = getTokenFromRequest(httpRequest);
 
-        System.out.println("[" + LocalDateTime.now().toString() + "] TOKEN: " + token);
+        System.out.println("[" + LocalDateTime.now().toString() + "] TOKEN: " + token + "\n");
 
         if (token != null) {
             JwtData jwt = validateAndDecodeToken(token);
             if (jwt != null) {
-                System.out.println("-->" + jwt + "<--");
+                String email = jwt.getEmail();
+                UserRol role = jwt.getRol();
+                Service service = jwt.getService();
+                String audience = jwt.getAudience();
+
+                System.out.println("[" + LocalDateTime.now().toString() + "] email=" + email + " role=" + role
+                        + " service=" + service + " audience=" + audience + "\n");
+
+                if (audience != null) {
+                    // Definimos la autoridad
+                    String authorityValue = null;
+                    if (audience.equals("INTERNAL") && service != null) {
+                        authorityValue = service.toString();
+                    } else if (audience.equals("EXTERNAL") && role != null) {
+                        authorityValue = String.format("ROLE_%s", role);
+                    }
+
+                    if (authorityValue != null &&
+                            SecurityContextHolder.getContext().getAuthentication() == null) {
+
+                        // Crear la autoridad con la autoridad oportuna
+                        SimpleGrantedAuthority authority = new SimpleGrantedAuthority(authorityValue);
+
+                        // Crear autenticación
+                        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
+                                email, null, Collections.singletonList(authority));
+                        authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpRequest));
+
+                        // Establecer autenticación en el contexto de seguridad
+                        SecurityContextHolder.getContext().setAuthentication(authentication);
+                    }
+                }
             }
         }
 
-        // String email = getEmailFromToken(jwt);
-        // UserRol role = getRoleFromToken(jwt);
-        // System.out.print(" email=" + email + " role=" + role + " ");
-
-        // if (email != null && role != null &&
-        // SecurityContextHolder.getContext().getAuthentication() == null) {
-        // // Crear la autoridad con el rol del token
-        // SimpleGrantedAuthority authority = new
-        // SimpleGrantedAuthority(formatRole(role));
-
-        // // Crear autenticación
-        // UsernamePasswordAuthenticationToken authentication = new
-        // UsernamePasswordAuthenticationToken(email,
-        // null, Collections.singletonList(authority));
-        // authentication.setDetails(new
-        // WebAuthenticationDetailsSource().buildDetails(httpRequest));
-
-        // // Establecer autenticación en el contexto de seguridad
-        // SecurityContextHolder.getContext().setAuthentication(authentication);
-        // }
-        // }
-        // }
-
         // Continuar con el resto de filtros
         chain.doFilter(request, response);
     }
diff --git a/java/services/bookings/src/main/java/com/uva/api/bookings/models/external/JwtData.java b/java/services/bookings/src/main/java/com/uva/api/bookings/models/external/jwt/JwtData.java
similarity index 87%
rename from java/services/bookings/src/main/java/com/uva/api/bookings/models/external/JwtData.java
rename to java/services/bookings/src/main/java/com/uva/api/bookings/models/external/jwt/JwtData.java
index 269e9c8020b8cbdc8277747a1d0be8bd6bb363f1..09569e2dd56dd1ecca97d38c97c5ebde182b0ab5 100644
--- a/java/services/bookings/src/main/java/com/uva/api/bookings/models/external/JwtData.java
+++ b/java/services/bookings/src/main/java/com/uva/api/bookings/models/external/jwt/JwtData.java
@@ -1,4 +1,4 @@
-package com.uva.api.bookings.models.external;
+package com.uva.api.bookings.models.external.jwt;
 
 import java.util.Date;
 
@@ -21,7 +21,7 @@ public class JwtData {
   private String name;
   private String email;
   private UserRol rol;
-  private String service;
+  private Service service;
 
   private String subject;
   private String audience;
diff --git a/java/services/bookings/src/main/java/com/uva/api/bookings/models/external/jwt/Service.java b/java/services/bookings/src/main/java/com/uva/api/bookings/models/external/jwt/Service.java
new file mode 100644
index 0000000000000000000000000000000000000000..08d10e5b58cae91c9a05d18b013f21b897710148
--- /dev/null
+++ b/java/services/bookings/src/main/java/com/uva/api/bookings/models/external/jwt/Service.java
@@ -0,0 +1,8 @@
+package com.uva.api.bookings.models.external.jwt;
+
+public enum Service {
+  USERS,
+  HOTELS,
+  BOOKINGS,
+  AUTHENTICATION
+}
diff --git a/java/services/bookings/src/main/java/com/uva/api/bookings/services/BookingService.java b/java/services/bookings/src/main/java/com/uva/api/bookings/services/BookingService.java
index 7576034e1c97825684588e2b3a7c4d5b87eb1c85..3ebed8a9abf0def8f1d8a78789b13419f7ec860a 100644
--- a/java/services/bookings/src/main/java/com/uva/api/bookings/services/BookingService.java
+++ b/java/services/bookings/src/main/java/com/uva/api/bookings/services/BookingService.java
@@ -18,7 +18,8 @@ import com.uva.api.bookings.repositories.BookingRepository;
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.stream.Stream;
+import java.util.function.Consumer;
+import java.util.function.Function;
 
 @Service
 public class BookingService {
@@ -26,31 +27,29 @@ public class BookingService {
     @Autowired
     private BookingRepository bookingRepository;
 
+    @Autowired
+    private TokenService tokenService;
+
     @Autowired
     private HotelApi hotelApi;
 
     @Autowired
     private UserApi userApi;
 
-    /**
-     * Consulta por bloques filtrados
-     * - fechas
-     * - roomId/hotelId
-     * - userId
-     * 
-     * @param start
-     * @param end
-     * @param hotelId
-     * @param roomId
-     * @param userId
-     * @return
-     */
     public ResponseEntity<?> getBookings(
+            String token,
             LocalDate start, LocalDate end,
             Integer hotelId, Integer roomId,
             Integer userId, Integer managerId) {
         List<Booking> bookings = null;
 
+        if (hotelId != null)
+            tokenService.assertPermission(token, hotelId);
+        if (userId != null)
+            tokenService.assertPermission(token, userId);
+        if (managerId != null)
+            tokenService.assertPermission(token, managerId);
+
         if (start != null && end != null) {
             if (start.isAfter(end))
                 throw new InvalidDateRangeException("Start can't be before than end");
@@ -141,13 +140,23 @@ public class BookingService {
         return ResponseEntity.ok(booking);
     }
 
-    public Booking findById(Integer id) {
-        return bookingRepository.findById(id)
+    /**
+     * Consulta una reserva por id y asegura que la entidad que la consulte sea un
+     * servicio/administrador o el dueño (cliente)
+     * 
+     * @param token
+     * @param id
+     * @return
+     */
+    public Booking findById(String token, Integer id) {
+        Booking b = bookingRepository.findById(id)
                 .orElseThrow(() -> new BookingNotFoundException(id));
+        tokenService.assertPermission(token, b.getUserId());
+        return b;
     }
 
-    public ResponseEntity<?> getBookingById(Integer id) {
-        Booking booking = findById(id);
+    public ResponseEntity<?> getBookingById(String token, Integer id) {
+        Booking booking = findById(token, id);
         bookingRepository.deleteById(id);
         return ResponseEntity.ok(booking);
     }
@@ -174,8 +183,8 @@ public class BookingService {
         return status;
     }
 
-    public ResponseEntity<?> deleteBooking(Integer id) {
-        Booking booking = findById(id);
+    public ResponseEntity<?> deleteBooking(String token, Integer id) {
+        Booking booking = findById(token, id);
         bookingRepository.deleteById(id);
 
         ClientStatus status = calculateClientStatus(id);
@@ -185,36 +194,40 @@ public class BookingService {
         return ResponseEntity.ok(booking);
     }
 
-    public List<Booking> deleteAllByHotelId(int hotelId) {
-        // Extraer reservas realizadas al hotel
-        List<Booking> bookings = bookingRepository.findAllByHotelId(hotelId);
+    private List<Booking> deleteAll(int id,
+            Function<Integer, List<Booking>> findAction,
+            Consumer<Integer> deleteAction) {
+        List<Booking> bookings = findAction.apply(id);
         if (bookings.isEmpty()) {
             return new ArrayList<>();
         }
-        bookingRepository.deleteAllByHotelId(hotelId);
+        deleteAction.accept(id);
+
         return bookings;
     }
 
-    public List<Booking> deleteAllByManagerId(int managerId) {
-        List<Booking> bookings = bookingRepository.findAllByManagerId(managerId);
-        if (bookings.isEmpty()) {
-            return new ArrayList<>();
-        }
-        bookingRepository.deleteAllByManagerId(managerId);
-        return bookings;
+    private List<Booking> deleteAllByHotelId(Integer userId) {
+        return deleteAll(userId,
+                bookingRepository::findAllByHotelId,
+                bookingRepository::deleteAllByHotelId);
     }
 
-    public List<Booking> deleteAllByUserId(Integer userId) {
-        List<Booking> bookings = bookingRepository.findAllByUserId(userId);
-        if (bookings.isEmpty()) {
-            return new ArrayList<>();
-        }
-        bookingRepository.deleteAllByUserId(userId);
-        return bookings;
+    private List<Booking> deleteAllByManagerId(Integer userId) {
+        return deleteAll(userId,
+                bookingRepository::findAllByManagerId,
+                bookingRepository::deleteAllByManagerId);
+    }
+
+    private List<Booking> deleteAllByUserId(Integer userId) {
+        return deleteAll(userId,
+                bookingRepository::findAllByUserId,
+                bookingRepository::deleteAllByUserId);
     }
 
     public ResponseEntity<?> deleteBookings(
-            Integer hotelId, Integer managerId, Integer userId) {
+            Integer hotelId,
+            Integer managerId, Integer userId) {
+
         List<Booking> bookings;
         String message;
         if (managerId != null) {
@@ -235,17 +248,21 @@ public class BookingService {
         return ResponseEntity.ok(bookings);
     }
 
+    /**
+     * Obtiene los ids de los cliente cuyas reservas finalizaron el dia anterior y
+     * actualiza su estado al nuevo
+     * 
+     * @return
+     */
     public long performDailyClientsStateUpdate() {
         LocalDate yesterday = LocalDate.now().minusDays(1);
 
         List<Booking> passedBookings = bookingRepository.findAllPassed(yesterday);
 
-        Stream<Integer> userIds = passedBookings.stream().map(b -> b.getUserId()).distinct();
-        userIds.forEach(userId -> {
+        return passedBookings.stream().map(Booking::getUserId).distinct().map(userId -> {
             ClientStatus status = calculateClientStatus(userId);
             userApi.updateClientState(userId, status);
-        });
-
-        return userIds.count();
+            return userId;
+        }).count();
     }
 }
diff --git a/java/services/bookings/src/main/java/com/uva/api/bookings/services/TokenService.java b/java/services/bookings/src/main/java/com/uva/api/bookings/services/TokenService.java
index e5cefeff4cdc6afa92f75497bdbd110fa327de21..75cdafc9e6c688eaf913af5fbdf7e9580646ede3 100644
--- a/java/services/bookings/src/main/java/com/uva/api/bookings/services/TokenService.java
+++ b/java/services/bookings/src/main/java/com/uva/api/bookings/services/TokenService.java
@@ -4,10 +4,12 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
+import org.springframework.web.client.HttpClientErrorException;
 
 import com.uva.api.bookings.api.TokenAPI;
-import com.uva.api.bookings.models.external.JwtData;
+import com.uva.api.bookings.models.external.jwt.JwtData;
 
 @Service
 public class TokenService {
@@ -24,25 +26,57 @@ public class TokenService {
 
   public String getServiceToken() {
     if (ownToken == null || expireSoon(ownToken)) {
-      System.out.println("Generando token");
+      System.out.println("\nGenerando token");
       long s = System.currentTimeMillis();
       ownToken = api.getServiceToken();
       long t = System.currentTimeMillis() - s;
-      System.out.println("Token Generando en " + t + " ms");
+      System.out.println("Token Generando en " + t + " ms\n");
     }
     return ownToken.getToken();
   }
 
   public JwtData decodeToken(String token) {
-    if (cache.containsKey(token))
-      return cache.get(token);
-    System.out.println("Actualizando token");
+    JwtData decoded;
+    if (cache.containsKey(token)) {
+      decoded = cache.get(token);
+      if (!expireSoon(decoded))
+        return cache.get(token);
+    }
+    System.out.println("\nActualizando token");
     long s = System.currentTimeMillis();
-    JwtData decoded = api.decodeToken(token);
+    decoded = api.decodeToken(token);
     long t = System.currentTimeMillis() - s;
-    System.out.println("Actualizando token en " + t + " ms");
+    System.out.println("Actualizando token en " + t + " ms\n");
     cache.put(token, decoded);
     return decoded;
   }
 
+  /**
+   * Valida que la entidad representada con el token tenga permisos de
+   * administrador, sea un servicio o sea el dueño del recurso (idExpected)
+   * 
+   * @param token
+   * @param idExpected
+   */
+  public void assertPermission(String token, int idExpected) {
+    JwtData decoded = decodeToken(token);
+    boolean isOwner = decoded.getId() == idExpected;
+    if (!isOwner)
+      assertPermission(token);
+  }
+
+  /**
+   * Valida que la entidad representada con el token tenga permisos de
+   * administrador o sea un servicio
+   * 
+   * @param token
+   */
+  public void assertPermission(String token) {
+    JwtData decoded = decodeToken(token);
+    boolean isAdmin = decoded.isAdmin();
+    boolean isService = decoded.getService() != null && decoded.getAudience().equals("INTERNAL");
+    if (!isAdmin && !isService)
+      throw new HttpClientErrorException(HttpStatus.FORBIDDEN);
+  }
+
 }
diff --git a/java/services/bookings/src/main/java/com/uva/api/bookings/utils/Utils.java b/java/services/bookings/src/main/java/com/uva/api/bookings/utils/Utils.java
new file mode 100644
index 0000000000000000000000000000000000000000..94e02987b9f241d9b35f42964305dbbcbcfbd231
--- /dev/null
+++ b/java/services/bookings/src/main/java/com/uva/api/bookings/utils/Utils.java
@@ -0,0 +1,14 @@
+package com.uva.api.bookings.utils;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.client.HttpClientErrorException;
+
+public class Utils {
+
+  public static String getToken(String authorization) {
+    String prefix = "Bearer ";
+    if (!authorization.startsWith(prefix))
+      throw new HttpClientErrorException(HttpStatus.FORBIDDEN);
+    return authorization.substring(prefix.length());
+  }
+}
diff --git a/java/services/users/src/main/java/com/uva/api/users/models/Client.java b/java/services/users/src/main/java/com/uva/api/users/models/Client.java
index 12ab1ed328c655693fac3d8855bb8a69d77d1db4..6130609737dec6a456d4e5f4f7b5ccca2abad40e 100644
--- a/java/services/users/src/main/java/com/uva/api/users/models/Client.java
+++ b/java/services/users/src/main/java/com/uva/api/users/models/Client.java
@@ -1,7 +1,5 @@
 package com.uva.api.users.models;
 
-import java.time.LocalDate;
-
 import jakarta.persistence.Column;
 import jakarta.persistence.Entity;
 import jakarta.persistence.EnumType;
diff --git a/poblate/index.js b/poblate/index.js
index 31b83e1b2ef1a1908cb42af154f1d48711e515af..a165bbd7cc180c7d8e073929185f241544cd7941 100644
--- a/poblate/index.js
+++ b/poblate/index.js
@@ -5,14 +5,50 @@ const { jwtDecode } = require("jwt-decode");
 const dev = require("./environments/env");
 const prod = require("./environments/env.production");
 
+const getKongHots = (host) => {
+	const defaultHost = "localhost";
+	const defaultPort = 8000;
+
+	if (host.match(/^(\d{1,3}\.){3}[\d]{1,3}:\d{1,5}$/)) {
+		return host; // host completo
+	} else if (host.match(/^([\d]{1,3}\.){3}[\d]{1,3}$/)) {
+		return host + `:${defaultPort}`; // hostname, agregar puerto por defecto
+	} else if (host.match(/^:\d{1,5}/)) {
+		return defaultHost + host; // puerto, agregar hostname por defecto
+	}
+	return `${defaultHost}:${defaultPort}`;
+};
+
+const getKongEnv = (env) => {
+	const { authApi, hotelsApi, bookingsApi } = env;
+	const apply = (api) =>
+		KONG ? api.replace(/:\/\/[\w.-]+(:\d+)?/, `://${KONG_SERVICE}`) : api;
+	return {
+		authApi: apply(authApi),
+		hotelsApi: apply(hotelsApi),
+		bookingsApi: apply(bookingsApi),
+	};
+};
+
 // Environments consts
 const args = process.argv;
 const isProduction = args.includes("--prod");
 const DEBUG = args.includes("--debug") || args.includes("-d");
 const FORCE = args.includes("--force") || args.includes("-f");
 const ERROR = args.includes("--error") || args.includes("-e");
-
-const env = (isProduction ? prod : dev).env;
+const kongLow = args.indexOf("-k");
+const kongIndex = isProduction
+	? kongLow != -1
+		? kongLow
+		: args.indexOf("--kong")
+	: -1;
+const KONG = kongIndex !== -1;
+
+const KONG_SERVICE = getKongHots(
+	args.length > kongIndex ? args[kongIndex + 1] ?? "" : ""
+);
+
+const env = getKongEnv((isProduction ? prod : dev).env);
 const { authApi, hotelsApi, bookingsApi } = env;
 
 const debug = (...values) => {
@@ -128,7 +164,7 @@ const insertHotel = async ({ manager, hotel }) => {
 				Authorization: `Bearer ${manager.token}`,
 			},
 		});
-		debug("Hotel added successful");
+		debug("Hotel added successful, identified by id " + data.id);
 		return data;
 	} catch (error) {
 		console.error("ERROR Al INSERTAR HOTEL");
@@ -155,7 +191,7 @@ const insertBookings = async (booking, token) => {
 				Authorization: `Bearer ${token}`,
 			},
 		});
-		debug("Booking added successful");
+		debug("Booking added successful, identified by id " + data.id);
 		return data;
 	} catch (error) {
 		console.error("ERROR Al INSERTAR RESERVA");