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 iframe
etiqueta simple que src
apunta a esta página.
console.log('Now we have first-party storage access!');
entrar en elthen
derequestStorageAccess()
?Respuestas:
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:
document.requestStorageAccess
tiene que ser llamado como resultado de una acción del usuario. A pesar de lo documentado en los documentos de MDN ,document.hasStorageAccess
no parece propagar la acción del usuario.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.
fuente