Integrarlo en una app de Tauri
Dónde vive el código de secretos, qué comandos se exponen, cómo se combina con el estado del core y por qué el frontend nunca ve un testigo.
Los comandos que se exponen
Ninguno que hable de secretos. Ésta es la decisión central y sale directa del nivel 14.4:
La última fila es la prueba de que la forma importa. Con comandos de dominio, el peor caso de un frontend comprometido es una molestia; con comandos primitivos, es la pérdida de las credenciales.
Dónde vive el código
Tres piezas, con el estado del core en medio:
// 1 · el módulo de secretos: la capa del nivel 37.5, sin saber de Taurimod secretos { pub fn obtener(cuenta: &str) -> (Option<String>, Fuente) { /* … */ } pub fn guardar(cuenta: &str, s: &str) -> Result<(), Error> { /* … */ } pub fn borrar(cuenta: &str) -> Result<(), Error> { /* … */ } pub fn disponible() -> bool { /* … */ }}// 2 · el estado del core: el testigo vivo, leído una vezstruct Sesion { testigo: RwLock<Option<Testigo>>,}// 3 · los comandos: de dominio, y no devuelven el testigo#[tauri::command]async fn iniciar_sesion( estado: State<'_, Sesion>, email: String, clave: String,) -> Result<Perfil, Error> { let t = api::autenticar(&email, &clave).await?; // guardar puede fallar (Linux): la sesión sigue siendo válida if let Err(e) = secretos::guardar(&email, &t.valor) { log::warn!("sesión no persistida: {e}"); } let perfil = t.perfil.clone(); *estado.testigo.write().await = Some(t); Ok(perfil)}Tres detalles del fragmento que no son decorativos:
- El módulo de secretos no conoce Tauri. Se puede probar sin arrancar una aplicación, que es la mitad de por qué esta fase es testable.
- El testigo vivo está en el estado del core —fase IV— y se lee del almacén una vez, no en cada operación. Nivel 35.2: cada lectura es una oportunidad de diálogo.
- Y que guardar falle no invalida la sesión. Es el caso de Linux del nivel 37.1: el usuario ha iniciado sesión de verdad; lo único que no va a pasar es que se recuerde la próxima vez.
El arranque
El otro momento donde encajan las piezas, y donde el orden importa:
El paso 4 es el que más se olvida y es el que evita el estado zombi: una aplicación que cree tener sesión con un testigo que el servidor ya no acepta, fallando en cada operación sin entender por qué.
Los permisos que esto necesita
Y una nota de la fase V que cierra el círculo: este diseño no necesita ningún permiso especial en tus capabilities, porque el frontend no habla con el almacén. Solo necesita poder llamar a tus tres comandos de dominio.
Si en algún momento te ves añadiendo un permiso de plugin de almacenamiento seguro a una capability, merece parar: significa que el frontend está tocando secretos directamente, y eso es la columna roja de la primera tabla.