Identidad y capacidades
reply2social no tiene usuarios. No los crea, no los guarda, no los autentica. Le pregunta al anfitrión —el sitio que lo hospeda— quién es la persona que está del otro lado.
El invariante
Este servicio nunca firma un token. Sólo valida.
Si tuviera con qué firmar, tendría con qué fabricar una identidad — y una identidad fabricada por el servicio que la usa no prueba nada. La única fuente de una identidad válida acá es el validador contra el anfitrión.
Cómo pasa
El anfitrión relee el usuario de la base en cada validación, en vez de creer lo que dice el token. Es lo que hace que suspender a alguien tenga efecto inmediato: el mismo token que funcionaba hace un segundo pasa a dar 401, sin esperar a que expire. Y si le bajan el rol, la respuesta trae el rol nuevo.
Las tres capacidades
Son acumulativas: quien puede administrar puede operar, y quien puede operar puede ver. En el código son extractores de axum — una ruta declara qué exige y el resto no se puede olvidar de comprobarlo.
| Capacidad | Ejemplos de rutas |
|---|---|
| Operar | aprobar una emisión, pausar la emisión, diseminar al archivo |
| Administrar | dar de alta cuentas, otorgar permisos, crear flujos, exportar el cauce |
La distinción que costó encontrar: 401 contra 503
Los dos son «no pasás». Significan cosas opuestas.
Un 401 cuando el anfitrión está caído es una mentira. Afirma «no sos nadie» cuando lo cierto es «no pude preguntar». La diferencia importa en la pantalla: con 401 el panel manda a entrar de nuevo —y entrar de nuevo no va a arreglar nada, porque el problema está en otro lado—, mientras que con 503 dice que el servicio de identidad no responde, que es lo que efectivamente pasa.
Esto no salía solo: el middleware se tragaba el error del validador y todo terminaba degradado a 401. Hizo falta llevar el fallo hasta el extractor para que el 503 sobreviviera.
Fail-closed, siempre
En ningún camino la duda se resuelve dejando pasar. Un servicio que ante la duda abre es un servicio que, el día que su dependencia falle, queda abierto — y ese es justo el día en que nadie está mirando.
Y las credenciales de las redes
Otra cosa, y conviene no mezclarlas: los tokens de Instagram, Mastodon o Telegram no son identidades de personas sino llaves de las cuentas.
- Se guardan cifrados con AES-256-GCM en
cuentas.credenciales_cifradas. - Nunca se devuelven, ni enmascarados. No hay endpoint que los muestre.
- Se cargan y ya: si te equivocaste, se vuelve a cargar.
No hay ningún endpoint HTTP que devuelva texto cifrado. El único camino que saca credenciales de la instalación es el respaldo por CLI, y no es un endpoint. Por eso el invariante no tiene excepciones que recordar.