Saltar a contenido

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á.

  1. Genera el token nuevo: openssl rand -hex 32.
  2. Ponlo en la vertical (GASTRO_INTERNAL_TOKEN en Gastro, INTERNAL_API_KEY en Travel) y reinicia la vertical.
  3. Ponlo en apps/operator/backend/.env y reinicia el BFF.
  4. Comprueba que la vertical volvió: en el panel debe dejar de aparecer como caída, o GET /api/v1/verticals debe devolverla con reachable: 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ó.

openssl rand -hex 32   # a apps/operator/backend/.env
./manage.sh up operator_back

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 UPDATE sobre hashed_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.

Relacionado