Saltearse al contenido

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

anfitrión (Antisionista)reply2socialnginxnavegadoranfitrión (Antisionista)reply2socialnginxnavegadorfirmado con un secreto compartidoGET /reply2fb/api/emisiones (con su cookie)1proxy, con la credencial tal cual2POST /api/reply2fb/validar3relee el usuario DE LA BASE:¿activo? ¿qué rol tiene hoy?4id + capacidades5¿alcanza para esta ruta?6200 · 401 · 403 · 5037

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

Ver

mirar el panel

Operar

aprobar, pausar, sembrar

Administrar

cuentas, permisos, flujos

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.

CapacidadEjemplos de rutas
Operaraprobar una emisión, pausar la emisión, diseminar al archivo
Administrardar 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.

sí: no sos nadie

sí: sos vos, sin permiso

sí: sos vos, con permiso

no pude preguntar

llega una petición

¿el anfitrión contestó?

401

«no estás autenticado»

403

«no te alcanza»

200

503

«no puedo saber quién sos»

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

¿el secreto no está configurado?

no arranca

¿el anfitrión no contesta?

503

¿la respuesta no se entiende?

¿la capacidad no alcanza?

403

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.