Rotar un token de vertical, o dar/quitar acceso a un operador
Rotar un OPERATOR_*_INTERNAL_TOKEN
El orden importa: si rotas primero en el BFF, el panel queda ciego a esa vertical hasta que actualices allá.
- Genera el token nuevo:
openssl rand -hex 32. - Ponlo en la vertical (
GASTRO_INTERNAL_TOKENen Gastro,INTERNAL_API_KEYen Travel) y reinicia la vertical. - Ponlo en
apps/operator/backend/.envy reinicia el BFF. - Comprueba que la vertical volvió: en el panel debe dejar de aparecer como caída, o
GET /api/v1/verticalsdebe devolverla conreachable: true.
Mientras dura el paso 2→3 el panel reporta esa vertical caída y sus mutaciones fallan con 502.
Ninguna vertical deja de funcionar para sus clientes: el token solo cubre /platform/*, que
es la puerta del panel. Los restaurantes y hoteles siguen operando.
Rotar OPERATOR_JWT_SECRET
Invalida todas las sesiones abiertas: los operadores tienen que volver a entrar. Es lo que quieres si sospechas que un token se filtró.
Crear un operador
docker exec -it timeliber-operator-api python -m app.cli create-operator \
--email nuevo@timeliber.com.co --full-name "Nombre Apellido"
La contraseña se pide por prompt (mínimo 12 caracteres, NIST 800-63B). Falla si el email ya existe — no sobreescribe a nadie en silencio.
Cambiarle la contraseña a un operador
docker exec -it timeliber-operator-api python -m app.cli set-password \
--email quien@timeliber.com.co
La nueva se pide por prompt (mínimo 12 caracteres), igual que al crear. El panel todavía no tiene "cambiar contraseña" en la UI — está en el backlog.
Hazlo por el CLI, no con un
UPDATEsobrehashed_password: escribir un hash de argon2 desde psql es la clase de operación donde un error deja la cuenta inaccesible y nadie se entera hasta el próximo login.
Quitarle el acceso a alguien
v1 no tiene endpoint para esto (está en el backlog junto con los roles). Hoy:
docker exec timeliber-postgres psql -U operator_user -d operator_db \
-c "UPDATE operator_users SET is_active = false WHERE email = 'quien@timeliber.com.co';"
Su JWT actual sigue siendo criptográficamente válido hasta que expire (12h por defecto), pero
get_current_operator revalida is_active contra la base en cada request, así que el acceso se
corta de inmediato.
Sí, esto es SQL manual — justo lo que el panel viene a eliminar. Es la última tarea que todavía lo exige, y está en el backlog. Que dé fastidio es la señal correcta.