Saltar al contenido

Enlaces profundos

Un enlace que abre tu aplicación en el sitio correcto: el esquema propio, el registro que hace falta en cada sistema, y la instancia única que recibe el enlace.

Las tres partes

La instancia única

No es opcional: sin ella, el segundo enlace abre una segunda copia de tu aplicación, con su propia base de datos —el problema del nivel 42.3— y su propio estado.

El patrón:

Rust
tauri::Builder::default()    .plugin(tauri_plugin_single_instance::init(|app, argv, _cwd| {        // ya había una instancia: aquí llegan los argumentos de la segunda        if let Some(enlace) = argv.iter().find(|a| a.starts_with("miapp://")) {            manejar_enlace(app, enlace);        }        // y traer la ventana al frente, que es lo que el usuario espera        if let Some(w) = app.get_webview_window("main") { let _ = w.set_focus(); }    }))

Y hay que registrarlo el primero, antes que los demás componentes: si otro plugin arranca antes, la segunda instancia ya habrá hecho trabajo antes de descubrir que sobra.

Elegir el esquema

Tres criterios:

  • Que sea inequívoco. Un esquema corto y común —tres o cuatro letras genéricas— probablemente lo use otra aplicación, y entonces quién se lo queda depende del orden de instalación. Un identificador con tu dominio inverso es lo seguro.
  • Que no cambie. Como el identificador del nivel 39.2: hay enlaces en correos y en páginas que van a seguir existiendo.
  • Y que no prometa lo que no cumples. Si tu esquema abre cualquier ruta, esas rutas son una API pública de tu aplicación.

Validar lo que llega

Y aquí está la parte de seguridad, porque un enlace profundo es entrada externa de la peor clase: cualquiera puede construir uno y hacérselo pulsar a un usuario tuyo, desde un correo o una página web.

El paso 3 es el importante y es el que casi nadie escribe: un enlace profundo es equivalente a un enlace en una página, y nadie aceptaría que pulsar un enlace en una web borrara datos sin confirmar.

El caso de la autenticación

El uso más común, y con un requisito adicional: cuando un flujo de autenticación devuelve al usuario a tu aplicación por un enlace profundo, ese enlace lleva un código.

Y hay que comprobar que corresponde a una petición que tú iniciaste —con un valor aleatorio generado al empezar y verificado al volver—, porque si no, cualquiera puede mandarle a tu usuario un enlace con un código suyo. Es un requisito del propio flujo y lo trata la fase VI en detalle; aquí importa saber que el enlace no se procesa a ciegas por venir de un flujo de autenticación.