Tidak dapat mengatur cookie di iframe menggunakan API Akses Penyimpanan di Safari

9

Saya memiliki iframe di halaman saya. Karena Safari memblokir cookie pihak ke-3, saya mencoba menggunakan API Akses Penyimpanan seperti yang disarankan di sini di bawah 'Panduan Pengembang': https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more / . Saya telah menyalin kode berikut dari dokumentasi :

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

Output konsol browser:

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

Seperti yang Anda lihat, hibah tampaknya berhasil tetapi masih tidak dapat mengatur cookie. Adakah yang tahu apa yang salah?

Safari Versi 13.0.1

EDIT: Output konsol di Safari 13.1:

[Log] hasAccess: false
[Log] error

Catatan: Halaman terlampir adalah iframetag sederhana dengan tanda srcke halaman ini.

lunr
sumber
1
Saya memiliki masalah yang sama. Akses penyimpanan tampaknya memberikan akses ke cookie yang ada tetapi tidak akan menyimpan yang baru. Ini berlaku untuk menggunakan "document.cookie" serta cookie baru yang dikembalikan di header "Set-Cookie". Dokumentasi tampaknya mengatakan itu harus berfungsi, tetapi tidak.
Matt Cosentino
Dengan Safari 13.1 permintaan ditolak tetapi saya tidak mengerti mengapa.
lunr
1
Ya, itu benar-benar membuat frustrasi. BTW Safari 13.1 mulai berlaku sama, sepertinya memberikan akses tetapi pengaturan cookie gagal.
lunr
Saat artikel ini menentukan ada beberapa aturan untuk memberikan akses. Dan, tidak harus console.log('Now we have first-party storage access!');datang dalam thendari requestStorageAccess()?
Supun Kavinda
@SupunKavinda 3 aturan pertama tidak berlaku di sini. Saya tidak sepenuhnya mengerti Aturan 5. Mungkin ini merujuk pada beberapa mekanisme lain yang telah memasukkan domain tersebut ke daftar hitam. Saya tidak berpikir ini berlaku juga tetapi saya akan mencoba beberapa hal untuk melihat apakah itu terkait.
Lun

Jawaban:

3

TL; DR

Pastikan cookie telah ditetapkan untuk domain dalam konteks pihak pertama.


Ada beberapa hal yang harus diperhatikan dengan contoh kode itu. Harap perhatikan hal berikut ini telah diuji pada Safari 13.1.

Ketentuan permintaan pengguna, dan pemberian akses selanjutnya:

  1. document.requestStorageAccessharus dipanggil sebagai hasil dari tindakan pengguna. Meskipun seperti yang didokumentasikan pada dokumen MDN , document.hasStorageAccesstampaknya tidak menyebarkan tindakan pengguna.
  2. Pengguna harus sudah berinteraksi dengan pihak ketiga dalam konteks pihak pertama. Setiap klik pada dokumen akan dilakukan.

Ketentuan untuk dapat menulis cookie:

Cookie harus sudah disetel di domain dalam konteks pihak pertama. Cookie ini dapat diatur oleh server sebagai header respons, atau oleh JS menggunakan document.cookie. Dengan sedikit pengujian lebih lanjut, sepertinya cookie ini TIDAK HARUS diatur dengan bendera domain agar cookie berikutnya diatur dalam konteks pihak ketiga. Ini berarti bahwa pada dasarnya, cookie yang ada juga harus disetel pada sub domain yang sama persis.

jackfrankland
sumber
Cookie berfungsi dengan mempertimbangkan kondisi ini. Tapi sepertinya Anda harus meminta akses setiap kali, jadi kami menemukan ini tidak dapat digunakan untuk saat ini. Mungkin kami masih melakukan sesuatu yang salah. Bagaimanapun, kami memutuskan untuk melakukan ini secara berbeda. Terima kasih.
lunr
@ Lunun, bisakah Anda membagikan hasilnya?
Sergey Korzhov