Permisos persistentes para la API de File System Access

Ahora hay una forma de obtener acceso persistente de lectura y escritura a archivos y carpetas sin tener que otorgar permisos de forma repetida. En esta publicación, se explica cómo funciona. Antes de profundizar en los detalles, hagamos un breve repaso de la situación actual y el problema que se está resolviendo.

Desafíos del método actual

La API de File System Access permite que los desarrolladores accedan a los archivos del disco duro local del usuario para leerlos y (opcionalmente) escribirlos. Una app popular (entre muchas otras) que usa esta API es Visual Studio Code (VS Code), el IDE de Microsoft que se ejecuta directamente en el navegador. Cuando abres VS Code, aparece una pantalla de Bienvenida en la que puedes crear un archivo nuevo o abrir uno existente, o bien una carpeta.

Pantalla de bienvenida de Visual Studio Code.

Si haces clic en Abrir carpeta y eliges una de las carpetas de tu disco duro, el navegador te preguntará si quieres que VS Code tenga acceso de visualización a esta carpeta.

Visual Studio Code solicita acceso de visualización.

Una vez que otorgues acceso, podrás navegar por la jerarquía de carpetas y abrir archivos en el editor de VS Code. Si modificas alguno de los archivos, el navegador te preguntará si quieres otorgar acceso de edición a la carpeta.

Visual Studio Code solicita acceso de edición.

Si lo permites, el ícono del archivo en la barra de direcciones cambiará y se agregará una pequeña flecha hacia abajo, lo que indica que la app tiene permisos de lectura y escritura. Para cambiar los permisos, haz clic en el ícono y, luego, en Quitar acceso para que la app ya no pueda editar archivos.

Visual Studio Code con un mensaje del ícono de la barra de direcciones.

El acceso dura hasta que cierras la última pestaña del origen. Si luego cierras la app y la vuelves a abrir, VS Code de alguna manera te permite continuar donde lo dejaste. Cuando haces clic en Abrir recientes, VS Code ofrece la carpeta abierta anteriormente para volver a abrirla.

Visual Studio Code ofrece los últimos archivos abiertos.

Sin embargo, incluso si ya otorgaste permiso de escritura a la carpeta, ahora debes volver a otorgar acceso. Esto se vuelve agotador muy rápido. Antes de profundizar en la solución, es decir, los permisos persistentes para la API de File System Access, ¿cómo hace VS Code para recordar las carpetas recientes?

Visual Studio Code solicita acceso de edición después de volver a cargar.

En la API de File System Access, el acceso a archivos y carpetas se administra a través de objetos FileSystemHandle: objetos FileSystemFileHandle para archivos y objetos FileSystemDirectoryHandle para carpetas (directorios). Ambos se pueden almacenar en IndexedDB, y eso es exactamente lo que hace VS Code. Para ver esto, abre las herramientas para desarrolladores de Chrome, navega a la sección IndexedDB en la pestaña Application y selecciona la tabla pertinente vscode-filehandles-store en la base de datos vscode-web-db.

Depuración de Chrome DevTools en Visual Studio Code que muestra la sección IndexedDB con el objeto FileSystemHandle almacenado.

La nueva forma: qué cambiará y cuándo

Chrome lanzará un nuevo comportamiento para permitir que los usuarios otorguen acceso permanente a sus archivos y carpetas de forma opcional, lo que evitará la necesidad de solicitarles acceso constantemente. El nuevo comportamiento se puede observar a partir de Chrome 122. Para probarlo antes, a partir de Chrome 120, activa las dos marcas chrome://flags/#file-system-access-persistent-permission y chrome://flags/#one-time-permission como Habilitadas.

En primer lugar, el nuevo comportamiento consiste en un nuevo mensaje de permiso de tres opciones que permite a los usuarios otorgar acceso a las apps a los archivos y las carpetas seleccionados en cada visita.

Visual Studio Code con un mensaje de permiso de tres vías.

Esta nueva instrucción de tres vías tiene las siguientes opciones:

  • Permitir durante este período: Permite que la app acceda a los archivos durante la sesión actual. (Esto corresponde al comportamiento existente).
  • Permitir en cada visita: Permite que la app tenga acceso indefinido, a menos que se revoque el acceso. Una vez que se le otorga acceso persistente a la app, los archivos y las carpetas que se abran recientemente también serán accesibles de forma persistente.
  • No permitir: No permite que la app acceda a los archivos. (Esto corresponde al comportamiento existente).

En segundo lugar, el nuevo comportamiento implica una nueva sección en la configuración del sitio, a la que los usuarios pueden acceder a través de un ícono de inicio junto al botón de activación Edición de archivos.

Configuración del sitio de Visual Studio Code con el ícono de edición de archivos.

Cuando se hace clic en este ícono de inicio, se abre la configuración de Privacidad y seguridad de la app en cuestión, en la que el usuario ve una lista de elementos para todos los archivos y las carpetas a los que la app tiene acceso. El acceso se puede revocar para cada elemento haciendo clic en el ícono de papelera. Quitar el acceso por elemento significa que la app aún puede tener acceso a los archivos en general. Para revocar el acceso en general, el usuario puede hacer clic en el ícono de la barra de direcciones, como se describió anteriormente.

Configuración de privacidad y seguridad de Chrome para el sitio vscode.dev.

Cómo activar el nuevo comportamiento

No hay cambios en la API de File System Access que afecten a los desarrolladores. Para activar el nuevo comportamiento con permisos persistentes, existen tres formas con diferentes condiciones previas que se deben cumplir:

  1. El usuario debe haber otorgado permiso a un archivo o carpeta (o a varios archivos o carpetas) durante la última visita a un origen, y la app debe haber almacenado los objetos FileSystemHandle correspondientes en IndexedDB. En la próxima visita al origen, la app debe haber recuperado cualquiera de los objetos FileSystemHandle almacenados de IndexedDB y, luego, haber llamado a su método FileSystemHandle.requestPermission(). Si se cumplen estas condiciones previas, se mostrará el nuevo mensaje de tres vías.
  2. El origen debe haber llamado al método FileSystemHandle.requestPermission() en un objeto FileSystemHandle al que se le otorgó acceso anteriormente, pero cuyo acceso se revocó automáticamente porque la pestaña estuvo en segundo plano durante un tiempo. (La revocación automática de permisos funciona según la misma lógica que se describe en el artículo Permisos únicos en Chrome). Si se cumplen estas condiciones previas, se mostrará la nueva instrucción de tres vías.
  3. El usuario debe haber instalado la app. Las apps instaladas conservarán automáticamente los permisos una vez que el usuario otorgue acceso. En este caso, no se mostrará la instrucción de tres opciones, sino que la app obtendrá el nuevo comportamiento de forma predeterminada.

En el primer y el segundo caso, la instrucción enumera todos los objetos FileSystemHandle a los que la app tenía acceso anteriormente, no solo el objeto para el que se llama al método requestPermission(). En consonancia con el funcionamiento de los permisos de un solo uso, si el usuario rechaza o descarta el mensaje más de tres veces, este ya no se activará y, en su lugar, se mostrará el mensaje de permiso normal.

Prueba el nuevo comportamiento

Si tienes una versión compatible de Chrome o configuraste las marcas requeridas, puedes probar el nuevo comportamiento en VS Code en la Web. Abre una carpeta y otorga acceso. Luego, cierra la pestaña, vuelve a abrirla y haz clic en Abrir recientes (ten en cuenta que la recarga inmediata no funciona para activar el mensaje; se deben cerrar todas las pestañas). Elige la carpeta anterior y aparecerá la nueva instrucción.

Conclusiones

Los permisos persistentes para la API de File System Access son una de las funciones más solicitadas de la API, y el error de implementación también es muy popular, ya que muchos desarrolladores lo marcaron como destacado. Con esta función en manos de los desarrolladores y, sobre todo, de los usuarios, se cierra una brecha importante en comparación con las apps específicas para cada plataforma.

Reconocimientos

Christine Hollingsworth, Austin Sullivan y Rachel Andrew revisaron esta publicación.