No se pueden establecer cookies en iframe con la API de acceso de almacenamiento en Safari

9

Tengo un iframe en mi página. Como Safari bloquea las cookies de terceros, intento utilizar la API de acceso al almacenamiento como se sugiere aquí en 'Orientación para desarrolladores': https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more / . He copiado el siguiente código de la documentación :

<script type="text/javascript">
  window.addEventListener('load', () => {
    document.getElementById('test-button').addEventListener('click', () => {
      document.hasStorageAccess().then(hasAccess => {
        console.log('hasAccess: ' + hasAccess);
        if (!hasAccess) {
          return document.requestStorageAccess();
        }
      }).then(_ => {
        console.log('Now we have first-party storage access!');
        document.cookie = "foo=bar";
        console.log(`document.cookie: ${document.cookie}`);
      }).catch(_ => {
        console.log('error');
      });
    });
  });
</script>

<button id="test-button">Test</button>

Salida de la consola del navegador:

[Log] hasAccess: true
[Log] Now we have first-party storage access!
[Log] document.cookie: 

Como puede ver, la concesión parece ser exitosa pero aún no puede configurar la cookie. ¿Alguien tiene una idea de lo que está mal?

Safari versión 13.0.1

EDITAR: Salida de consola en Safari 13.1:

[Log] hasAccess: false
[Log] error

Nota: La página adjunta es una iframeetiqueta simple que srcapunta a esta página.

lunr
fuente
1
Tengo el mismo problema. El acceso al almacenamiento parece dar acceso a las cookies existentes, pero no almacenará ninguna nueva. Esto se aplica al uso de "document.cookie", así como a las nuevas cookies devueltas en el encabezado "Set-Cookie". La documentación parece decir que debería funcionar, pero no es así.
Matt Cosentino
Con Safari 13.1 la solicitud es rechazada pero no podía entender por qué.
lunr
1
Sí, es realmente frustrante. Por cierto, Safari 13.1 comenzó a comportarse de la misma manera, parece dar acceso pero falla la configuración de cookies.
lunr
Como este artículo especifica, hay algunas reglas para otorgar acceso. Y, no debería console.log('Now we have first-party storage access!');entrar en el thende requestStorageAccess()?
Supun Kavinda
@SupunKavinda Las primeras 3 reglas no se aplican aquí. No entiendo completamente la Regla 5. Quizás se esté refiriendo a algún otro mecanismo que haya incluido en la lista negra el dominio. No creo que esto se aplique tampoco, pero intentaré algunas cosas para ver si eso está relacionado.
lunr

Respuestas:

3

TL; DR

Asegúrese de que ya se haya configurado una cookie para el dominio en un contexto propio.


Hay un par de cosas a tener en cuenta con ese ejemplo de código. Tenga en cuenta que lo siguiente se probó en Safari 13.1.

Condiciones de una solicitud de usuario y posterior concesión de acceso:

  1. document.requestStorageAccesstiene que ser llamado como resultado de una acción del usuario. A pesar de lo documentado en los documentos de MDN , document.hasStorageAccessno parece propagar la acción del usuario.
  2. El usuario ya debe haber interactuado con el tercero en un contexto de primera parte. Cualquier clic en el documento servirá.

Condiciones para poder escribir una cookie:

Ya se debe haber establecido una cookie en el dominio en un contexto de primera parte. Esta cookie puede ser configurada por el servidor como un encabezado de respuesta o por JS usando document.cookie. Con un poco de pruebas adicionales, parece que esta cookie NO DEBE configurarse con el indicador de dominio para que una cookie posterior se configure en el contexto de un tercero. Esto significa que, en efecto, la cookie existente también debe establecerse en el mismo subdominio exacto.

Jackfrankland
fuente
Las cookies funcionan teniendo en cuenta estas condiciones. Pero parece que tiene que solicitar acceso cada vez, por lo que nos parece inutilizable por ahora. Tal vez todavía estábamos haciendo algo más mal. En cualquier caso, decidimos hacer esto de manera diferente. Gracias.
lunr
@lunr ¿puedes compartir el resultado?
Sergey Korzhov