Nie można ustawić pliku cookie w elemencie iframe za pomocą interfejsu API Access Storage w przeglądarce Safari

9

Mam iframe na mojej stronie. Ponieważ Safari blokuje pliki cookie innych firm, staram się korzystać z interfejsu API Storage Storage, jak sugerowano tutaj w „Wskazówkach dla programistów”: https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more / . Skopiowałem następujący kod z dokumentacji :

<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>

Dane wyjściowe konsoli przeglądarki:

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

Jak widać, grant wydaje się udany, ale nadal nie można ustawić pliku cookie. Czy ktoś ma pojęcie, co jest nie tak?

Wersja Safari 13.0.1

EDYCJA: Dane wyjściowe konsoli w Safari 13.1:

[Log] hasAccess: false
[Log] error

Uwaga: załączająca strona jest prostym iframetagiem ze srcwskazaniem na tę stronę.

lunr
źródło
1
Mam ten sam problem. Dostęp do pamięci wydaje się zapewniać dostęp do istniejących plików cookie, ale nie będzie przechowywać nowych. Dotyczy to korzystania z pliku „document.cookie” oraz nowych plików cookie zwróconych w nagłówku „Set-Cookie”. Dokumentacja wydaje się mówić, że powinna działać, ale nie działa.
Matt Cosentino
W Safari 13.1 prośba została odrzucona, ale nie mogłem zrozumieć, dlaczego.
lunr
1
Tak, to naprawdę frustrujące. BTW Safari 13.1 zaczęło zachowywać się tak samo, wydaje się, że daje dostęp, ale ustawienie plików cookie kończy się niepowodzeniem.
lunr
Jak określono w tym artykule, istnieją pewne zasady udzielania dostępu. I nie powinny console.log('Now we have first-party storage access!');przyjść w thenod requestStorageAccess()?
Supun Kavinda
@SupunKavinda Pierwsze 3 zasady nie mają tutaj zastosowania. Nie do końca rozumiem zasadę 5. Może odnosi się do innego mechanizmu, który umieścił domenę na czarnej liście. Nie sądzę, żeby to miało zastosowanie, ale spróbuję kilka rzeczy, aby sprawdzić, czy to jest powiązane.
lunr

Odpowiedzi:

3

TL; DR

Upewnij się, że w domenie został już ustawiony plik cookie.


Jest kilka rzeczy, na które należy zwrócić uwagę w tym przykładzie kodu. Uwaga: poniższe testy zostały przetestowane w przeglądarce Safari 13.1.

Warunki monitu użytkownika, a następnie przyznania dostępu:

  1. document.requestStorageAccessmusi zostać wywołany w wyniku działania użytkownika. Pomimo tego, jak udokumentowano w dokumentach MDN , document.hasStorageAccessnie wydaje się propagować działania użytkownika.
  2. Użytkownik musi już wchodzić w interakcje z osobą trzecią w kontekście pierwszej osoby. Wystarczy każde kliknięcie dokumentu.

Warunki możliwości zapisania pliku cookie:

Plik cookie musi być już ustawiony w domenie w kontekście pierwszej strony. Ten plik cookie może zostać ustawiony przez serwer jako nagłówek odpowiedzi lub przez JS za pomocą document.cookie. Po nieco dalszych testach wydaje się, że NIE MOŻNA ustawić tego pliku cookie z flagą domeny, aby kolejny plik cookie mógł zostać ustawiony w kontekście strony trzeciej. Oznacza to, że w rzeczywistości istniejący plik cookie musi być również ustawiony na tę samą dokładną subdomenę.

Jackfrankland
źródło
Pliki cookie działają z uwzględnieniem tych warunków. Wygląda jednak na to, że musisz za każdym razem poprosić o dostęp, więc na razie nie możemy z tego skorzystać. Może nadal robiliśmy coś złego. W każdym razie decydujemy się to zrobić inaczej. Dzięki.
lunr
@lunr czy możesz udostępnić wynik?
Sergey Korzhov
@tam mam ten sam problem. Czy jest jakiś sposób na ustawienie plików cookie, czy nie w IFrame.
MikBTC