====== 12 - La Forja: acceso identificado al gremio ====== La API es pública: cualquiera puede borrar héroes y nadie sabe quién consulta. El último paso aplica el tema: **autenticación y autorización, tokens opacos, renovación y rotación, ''Principal'' y filtro Servlet**. Lo externo es el formato del intercambio; el mecanismo que lo cumple lo diseña cada uno. ===== 1. Qué se pide ===== * **Login con credenciales**: el que valida usuario y contraseña entrega un **par de tokens opacos** — y ese intercambio es un contrato fijo: { "accessToken": "kR9x..._A2t", "refreshToken": "bV3q...8fTw" } * El **token de acceso** viaja en cada petición protegida en la cabecera ''Authorization: Bearer ...''. El de **renovación** solo sirve para pedir un par nuevo, que **rota**: tras la renovación, el par antiguo deja de valer. * Cada autenticación (el login y el chequeo del token en cada petición) deja una **identidad** disponible para el resto del procesamiento: el controlador sabe **quién** llama, con su nombre y su rol. * **Autorización por rol**: el **maestro** administra la plantilla y la forja (altas y borrados); el resto de usuarios autenticados solo consulta. Cada endpoint decide si basta con estar autenticado o si exige un rol. * Los dos estados finales se distinguen: quien llega sin identidad recibe ''401 Unauthorized''; quien llega sin permiso, ''403 Forbidden''. Ambos por el canal del manejador global del paso 10. * Los tokens se generan con un generador criptográficamente seguro (''SecureRandom'' con formato **URL de Base64**) y el almacén de sesiones activas guarda su **hash**, nunca el valor en claro: robar el almacén no da por qué vale el token. * Las contraseñas se guardan con **hash**, nunca en claro. * El estado de las sesiones activas obedece a lo ya aprendido en el paso 11: tiene caducidad, no crece sin límite, y el contexto por petición se limpia al terminar — el hilo de Tomcat se reutiliza. ===== 2. Con qué ===== * Todo lo del tema: autenticación frente a autorización, **tokens opacos**, **renovación** y **rotación**, roles, ''Principal'', estado por petición (''ThreadLocal'' y su limpieza) y el **filtro Servlet** que se ejecuta antes del controlador. * El generador seguro del tema y el principio del hash guardado: lo mismo que se hace con la contraseña se hace con los tokens — el valor en claro jamás se almacena. * Lo que ya quedó en pie de pasos anteriores: el manejador global del 10 traduce los fallos, y el estado compartido del 11 delimita lo que pertenece a cada hilo. ===== 3. Decisiones tuyas ===== * ¿Dónde vive cada pieza y con qué nombre? El rol como **enum**, el ''Principal'' propio y el servicio que lo construyen son tuyos: decide el nombre y lo mínimo que llevan. * ¿Quién valida el token y **dónde**? La decisión esperada es el filtro, que se ejecuta antes de que el controlador exista; si eliges otra, se defiende. * ¿Qué pasa cuando el token no vale o no llega? ¿Y qué pasa con el token de renovación **consumido** que reaparece (la rotación marcó la reutilización como alarma: decide cuál es la consecuencia)? * ¿Cómo marca cada endpoint lo que exige: sin identidad, con rol? ¿El controlador consulta el contexto por petición, o el filtro le entrega la identidad ya resuelta? * ¿Cuánto vive cada token y cuántas veces se puede renovar? La caducidad es decisión del diseño, no del azar. ===== 4. Comprobación ===== * El login con credenciales correctas entrega el par de tokens con el formato del contrato; con credenciales malas, falla con ''401'' y sin revelar cuál de las dos falló. * Con el token de acceso llega la identidad a cada endpoint: una petición "¿quién soy?" muestra al usuario autenticado, y en ningún log ni token ni contraseña. * La protección coincide con la tabla: el maestro administra, el resto consulta; un usuario autenticado sin permiso recibe un ''403'', no un error más. * El token de acceso caducado o desconocido es un ''401'' de siempre: el mensaje dice qué ocurre, no cómo se comprobó. * La renovación con el token válido entrega par nuevo y deja inutilizado el antiguo: reutilizarlo despierta la alarma de la reutilización que se haya decidido. * Tras cada petición, el contexto de identidad queda limpio: repetir la misma petición en el mismo hilo no arrastra el ''Principal'' del usuario anterior. * Las pruebas del paso 10 pasan enteras — ahora, para el que ya está autenticado. ===== 5. Cierre del arco ===== El paso 12 completa el recorrido: la app del paso 01 (pseudocódigo del gremio) acaba siendo una **API REST autenticada por tokens opacos**, con roles, filtro y estado por petición — los mismos héroes y la misma forja, construidos paso a paso por quien los había diseñado al principio del curso. Nada del final se improvisa: **nunca** se escriben tokens ni contraseñas en los logs (la regla ya estaba en el paso 10); las contraseñas y los tokens se guardan siempre con **hash**; y el almacén de sesiones activas es, de nuevo, **estado compartido entre hilos** (paso 11) — la caducidad y la limpieza de sesiones vencidas también lo son.