Eu tenho um iframe na minha página. Como o Safari bloqueia cookies de terceiros, estou tentando usar a API de acesso ao armazenamento, conforme sugerido aqui em 'Orientação ao desenvolvedor': https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more / . Copiei o seguinte código da documentação :
<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>
Saída do console do navegador:
[Log] hasAccess: true
[Log] Now we have first-party storage access!
[Log] document.cookie:
Como você pode ver, a concessão parece ter êxito, mas ainda não pode definir o cookie. Alguém tem uma idéia do que está errado?
Safari Versão 13.0.1
EDIT: Saída do console no Safari 13.1:
[Log] hasAccess: false
[Log] error
Nota: A página anexa é uma iframe
tag simples, src
apontando para esta página.
console.log('Now we have first-party storage access!');
entrar nothen
derequestStorageAccess()
?Respostas:
TL; DR
Verifique se um cookie já foi definido para o domínio em um contexto primário.
Há algumas coisas a serem observadas nesse exemplo de código. Observe que o seguinte foi testado no Safari 13.1.
Condições de um prompt do usuário e subseqüente concessão de acesso:
document.requestStorageAccess
deve ser chamado como resultado de uma ação do usuário. Apesar de documentado nos documentos MDN ,document.hasStorageAccess
não parece propagar a ação do usuário.Condições de poder escrever um cookie:
Um cookie já deve ter sido definido no domínio em um contexto primário. Esse cookie pode ser definido pelo servidor como um cabeçalho de resposta ou por JS usando document.cookie. Com alguns testes adicionais, parece que esse cookie NÃO DEVE ser definido com o sinalizador de domínio para que um cookie subsequente seja definido no contexto de terceiros. Isso significa que, na verdade, o cookie existente também deve ser definido no mesmo subdomínio exato.
fonte