Não é possível definir o cookie no iframe usando a API de acesso ao armazenamento no Safari

9

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 iframetag simples, srcapontando para esta página.

lunr
fonte
11
Eu tenho o mesmo problema. O acesso ao armazenamento parece dar acesso aos cookies existentes, mas não armazena nenhum novo. Isso se aplica ao uso de "document.cookie", bem como aos novos cookies retornados no cabeçalho "Set-Cookie". A documentação parece dizer que deve funcionar, mas não funciona.
Matt Cosentino
Com o Safari 13.1, a solicitação é rejeitada, mas eu não conseguia entender o porquê.
lunr 7/04
11
Sim, é realmente frustrante. O BTW Safari 13.1 começou a se comportar da mesma maneira, parece dar acesso, mas a configuração de cookies falha.
lunr 8/04
Como este artigo especifica, existem algumas regras para conceder acesso. E, não deveria console.log('Now we have first-party storage access!');entrar no thende requestStorageAccess()?
Supun Kavinda
@SupunKavinda As três primeiras regras não se aplicam aqui. Eu não entendo completamente a Regra 5. Talvez esteja se referindo a algum outro mecanismo que colocou a lista negra no domínio. Também não acho que isso se aplique, mas tentarei algumas coisas para ver se isso está relacionado.
lunr 9/04

Respostas:

3

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:

  1. document.requestStorageAccessdeve ser chamado como resultado de uma ação do usuário. Apesar de documentado nos documentos MDN , document.hasStorageAccessnão parece propagar a ação do usuário.
  2. O usuário já deve ter interagido com o terceiro em um contexto de primeiro. Qualquer clique no documento serve.

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.

jackfrankland
fonte
Os cookies funcionam levando em consideração essas condições. Mas parece que você precisa solicitar acesso a cada vez, portanto, achamos isso inutilizável por enquanto. Talvez ainda estivéssemos fazendo outra coisa errada. De qualquer forma, decidimos fazer isso de maneira diferente. Obrigado.
lunr 16/04
@lunr você pode compartilhar o resultado?
Sergey Korzhov