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 iframe
tag sederhana dengan tanda src
ke halaman ini.
console.log('Now we have first-party storage access!');
datang dalamthen
darirequestStorageAccess()
?Jawaban:
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:
document.requestStorageAccess
harus dipanggil sebagai hasil dari tindakan pengguna. Meskipun seperti yang didokumentasikan pada dokumen MDN ,document.hasStorageAccess
tampaknya tidak menyebarkan tindakan pengguna.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.
sumber