Permisos persistentes para la API de File System Access

Ahora existe una manera de obtener acceso persistente de lectura y escritura a archivos y carpetas sin tener que otorgar permisos varias veces. En esta publicación, se explica cómo funciona. Antes de entrar en los detalles, un breve resumen del statu quo y el problema que se resuelve.

Desafíos del método actual

La API de File System Access permite a los desarrolladores acceder a los archivos del disco duro local del usuario de manera de lectura y (opcionalmente) escritura. 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 abras VS Code, aparecerá una pantalla de Bienvenida en la que podrás crear un archivo nuevo o abrir un archivo o una carpeta existentes.

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 lectura a esta carpeta.

Visual Studio Code solicita acceso de lectura.

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, cambiará el ícono del archivo en la barra de direcciones y se agregará una pequeña flecha hacia abajo, que indicará 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 en el ícono de la barra de direcciones.

El acceso dura hasta que cierras la última pestaña del origen. Si cierras la app y la vuelves a abrir, VS Code puedes continuar desde donde la dejaste. Cuando haces clic en Abrir reciente, VS Code te ofrece la carpeta previamente abierta para que se vuelva a abrir.

Visual Studio Code que ofrece los archivos abiertos por última vez.

Pero incluso si ya otorgaste permiso de escritura a la carpeta, ahora debes volver a otorgar acceso. Esto se agota muy rápido. Antes de sumergirnos 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 la página.

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

Las Herramientas para desarrolladores de Chrome depuran Visual Studio Code, que muestra la sección IndexedDB con el FileSystemHandle almacenado.

La nueva forma: qué cambia y cuándo

Chrome lanzará un nuevo comportamiento para que los usuarios puedan otorgar acceso permanente a sus archivos y carpetas de manera opcional. De esta forma, no tendrá que volver a pedirles permiso de forma constante. El nuevo comportamiento se puede observar a partir de Chrome 122. Para probarla antes, a partir de Chrome 120, cambia las dos marcas chrome://flags/#file-system-access-persistent-permission y chrome://flags/#one-time-permission a Habilitados.

En primer lugar, el nuevo comportamiento consiste en una nueva solicitud de permiso tripartito que, de manera opcional, permite a los usuarios otorgar a las apps acceso 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 direcciones tiene las siguientes opciones:

  • Permitir esta vez: Permite que la app tenga acceso a los archivos de 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 a la app se le haya otorgado acceso persistente, también se podrá acceder de forma persistente a los archivos y carpetas recién abiertos.
  • No permitir: No permite que la app tenga acceso 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 con un ícono de inicio junto al botón de activación de 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, donde el usuario ve una lista de elementos de todos los archivos y carpetas a los que tiene acceso la app. El acceso se puede revocar por elemento si haces clic en el ícono de la papelera. Quitar el acceso por elemento implica que la app aún puede obtener 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 para desarrolladores. Para activar el comportamiento nuevo con permisos persistentes, se deben cumplir tres maneras con diferentes condiciones previas:

  1. El usuario debe haber otorgado permiso a un archivo o a una 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á la nueva instrucción de tres vías.
  2. El origen debe haber llamado al método FileSystemHandle.requestPermission() en una FileSystemHandle al que se le otorgó acceso con anterioridad, pero cuyo acceso se revocó automáticamente debido a que la pestaña se puso 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 los permisos automáticamente una vez que el usuario otorgue el acceso. En este caso, no se mostrará el mensaje de tres vías, sino que la app obtiene el nuevo comportamiento de forma predeterminada.

En el primer y el segundo caso, el mensaje enumera todos los objetos FileSystemHandle a los que la app tenía acceso antes, no solo a aquel para el cual se llama al método requestPermission(). Alineación con la forma en que funciona en permisos únicos, si el usuario rechaza o descarta la solicitud más de tres veces, ya no se activará y, en su lugar, se mostrará la solicitud de permiso normal.

Prueba el nuevo comportamiento

Si tienes una versión compatible de Chrome o tienes configuradas 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 reciente (ten en cuenta que la recarga inmediata no funciona para activar el mensaje; es necesario cerrar todas las pestañas). Elige la carpeta anterior y aparecerá el nuevo mensaje. Si deseas obtener un caso de prueba más reducido, consulta la demostración de acceso al sistema de archivos persistentes y verifica su código fuente.

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, y muchos desarrolladores lo destacan. Al llevar esta función a los desarrolladores y, ante todo, a los usuarios, se cierra una importante brecha de funciones en comparación con las apps específicas de la plataforma.

Agradecimientos

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