Saltar al contenido

La máquina sin sesión

Contenedores, servidores, integración continua y sesiones remotas: dónde no hay almacén de ninguna clase y qué se hace en su lugar, sin fingir que sí lo hay.

Dónde no hay almacén

Fíjate en el patrón de la segunda columna: en todos, el secreto viene de fuera del proceso, puesto por quien decidió arrancarlo. Es un modelo completamente distinto al de esta fase —donde el secreto lo obtiene la aplicación y lo guarda— y por eso mezclar los dos produce diseños confusos.

Las tres fuentes que funcionan ahí

La cadena de fuentes

El patrón que resuelve esto sin dispersar el código: una función que devuelve el secreto probando fuentes en orden, con el almacén del sistema como preferido.

Rust
pub enum Fuente { Almacen, Entorno, Fichero, Ninguna }pub fn obtener(cuenta: &str) -> (Option<String>, Fuente) {    // 1 · el almacén del sistema, si hay    if let Ok(Some(s)) = almacen::leer(cuenta) {        return (Some(s), Fuente::Almacen);    }    // 2 · el entorno, para ejecuciones desatendidas    if let Ok(s) = std::env::var("MIAPP_TOKEN") {        return (Some(s), Fuente::Entorno);    }    // 3 · un fichero, si quien orquesta lo puso    if let Some(s) = fichero_de_secreto() {        return (Some(s), Fuente::Fichero);    }    (None, Fuente::Ninguna)}

Y devolver la fuente, no solo el secreto, porque de ella dependen dos decisiones:

  • Si vino del entorno o de un fichero, no intentes guardarlo en el almacén. No es tuyo: lo puso quien te arrancó, y guardarlo lo duplica en un sitio que él no controla.
  • Y si vino de ahí, tampoco lo borres al cerrar sesión. Borrar algo que no guardaste es la clase de sorpresa que rompe automatizaciones ajenas.

Cuándo pasa sin que lo esperes

Una aplicación de escritorio en un contenedor suena a algo que no va a ocurrir, y ocurre en cuatro sitios reales:

  • Tus propias pruebas automatizadas, que arrancan la aplicación en una máquina sin escritorio. Es la razón número uno por la que la gente descubre esto.
  • Una versión sin interfaz de tu herramienta, si la aplicación también tiene un modo de línea de comandos.
  • Escritorios remotos y entornos virtualizados en empresas.
  • Y usuarios que arrancan la aplicación desde una terminal remota, que es más frecuente en Linux de lo que parece.

El primero es el que te va a pasar seguro, y descubrirlo con las pruebas es la forma barata: si tu suite arranca la aplicación y falla por no haber almacén, ya tienes el aviso antes que ningún usuario.