El CLI tecsas3-cli soporta dos esquemas de autenticación contra el backend Django del Ecosistema Salud TecsaS3: el DRF Token legacy y JWT (SimpleJWT). Ambos se almacenan localmente en el keyring del sistema operativo o, cuando este no está disponible, en un archivo con permisos 0600 que sólo el usuario actual puede leer y escribir. Esta página documenta los sub-comandos de tecsas3 auth, los mecanismos de almacenamiento de credenciales y la auto-detección del tipo de token en tiempo de ejecución. Para la configuración de tenant y perfiles, consulta configuration.

Esquemas de autenticación

Token opaco de 40 caracteres generado por rest_framework.authtoken y expuesto en POST /api/autenticar/. Es el esquema por defecto del CLI y se envía como Authorization: Token <KEY>. Se utiliza en flujos legacy y tokens de larga duración asociados a un usuario.
Cuando el CLI detecta que el token guardado (en keyring o en TECSAS3_TOKEN) comienza por eyJ — prefijo típico de un JWT codificado en base64 — y el esquema configurado es token, promueve automáticamente el esquema a jwt para emitir el header Bearer correcto. No hace falta cambiar --auth-scheme en runtime; la detección vive en cli/src/tecsas3_cli/runtime.py:Runtime.build.

Almacenamiento de credenciales

Los secretos nunca se persisten en config.toml. Viven en una de dos ubicaciones, según disponibilidad del backend keyring del sistema operativo:
  1. Keyring del SO — entrada tecsas3-cli:<profile>:access (y :refresh si aplica). Es la ruta prioritaria: si el backend responde, se usa. Permite múltiples perfiles sin colisión de username.
  2. Archivo fallback~/.tecsas3/credentials, JSON con la estructura {<profile>: {"access": "...", "refresh": "..."}}. Permisos 0600 (sólo lectura/escritura para el usuario); el directorio padre se crea con 0700.
El archivo de credenciales se inspecciona con ls -la ~/.tecsas3/ y se borra de forma segura eliminando el archivo. El CLI no expone un servicio central de logout server-side: la revocación real la hace el admin Django o, en el caso de JWT, la app rest_framework_simplejwt.token_blacklist.
No copies ~/.tecsas3/credentials a un volumen compartido, ni lo subas a un repositorio. Si necesitas portar el perfil entre máquinas, vuelve a ejecutar tecsas3 auth login en el destino. Nunca expongas el token en logs, scripts o variables de shell persistidas en ~/.bashrc.

Sub-comandos de tecsas3 auth

Ejemplos de uso

Variables de entorno relevantes

Buenas prácticas

  • Un perfil por entorno — usa --profile dev, --profile prod, --profile staging y no mezcles tokens entre ellos.
  • Rotación periódica — al menos cada 90 días para DRF Token; el refresh de JWT se puede rotar sin re-login hasta que expire.
  • No combines --debug con --redact-phi=false en producción — la redacción PHI está activa por defecto en logs stderr para evitar fugas accidentales de nombres, cedula o diagnostico.
  • En CI, exporta TECSAS3_TOKEN y NO_COLOR=1 — evita keyring (que requiere TTY) y mantiene los logs limpios.

Troubleshooting

Login fallido (401) con credenciales correctas

Verifica que el esquema (--scheme) coincide con el del backend. Si el servidor migró de DRF Token a JWT, el flag --scheme token seguirá mandando Authorization: Token ... y el backend lo rechazará aunque la contraseña sea válida.

Keyring backend not available en CI

El backend keyring requiere un TTY y un servicio de sistema (gnome-keyring, kwallet, Keychain). En runners de CI no hay ninguno de los dos. Soluciones:

AuthError (exit 3) al primer comando del día

El token DRF Token no expira por sí solo pero puede ser revocado por el admin. El JWT expira según ACCESS_TOKEN_LIFETIME (configurado en SIMPLE_JWT). Si recibes Token expired at ..., rota:

Token detectado como token cuando es JWT

Si el esquema configurado en config.toml es token pero el token guardado empieza por eyJ, el runtime auto-promueve a jwt. Si aún así el backend responde 401, fuerza el esquema en la línea de comando:

Inspección del perfil y el token

Integración con agentes de IA

La combinación --json --no-input + credenciales vía env permite que cualquier agente (claude-code, opencode, mcode, pi, hermes) opere el CLI sin intervención humana.
Los agentes deben:
  • Capturar siempre exit_code — los TecsaError se serializan a stderr con code, message, hint y request_id.
  • Preferir --json sobre --format yaml|csv — el parseo es 1:1 sin ambigüedades.
  • Evitar --debug en producción — filtra PHI al contexto del agente.
  • Rotar tokens vía auth rotate --login cuando se detecte exit 3 repetido.

Rotación de credenciales en flota

Para rotar tokens en muchos hosts a la vez:

Siguientes pasos