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 (
SecureRandomcon 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 (ThreadLocaly 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
Principalpropio 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
401y 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
401de 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
Principaldel 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.