Không thể đặt cookie trong iframe bằng API truy cập lưu trữ trên Safari


9

Tôi có một iframe trên trang của tôi. Vì Safari chặn cookie của bên thứ 3, tôi đang cố gắng sử dụng API truy cập lưu trữ như được đề xuất ở đây trong 'Hướng dẫn dành cho nhà phát triển': https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more / . Tôi đã sao chép mã sau đây từ tài liệu :

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

Đầu ra bảng điều khiển trình duyệt:

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

Như bạn có thể thấy, khoản tài trợ dường như thành công nhưng vẫn không thể đặt cookie. Có ai có ý kiến ​​gì không?

Phiên bản Safari 13.0.1

EDIT: Đầu ra giao diện điều khiển trên Safari 13.1:

[Log] hasAccess: false
[Log] error

Lưu ý: Trang kèm theo là một iframethẻ đơn giản với một srctrỏ đến trang này.


1
Tôi có cùng một vấn đề. Truy cập lưu trữ dường như cung cấp quyền truy cập vào các cookie hiện có nhưng sẽ không lưu trữ bất kỳ cookie mới nào. Điều này áp dụng cho việc sử dụng "document.cookie" cũng như các cookie mới được trả về trong tiêu đề "Set-Cookie". Các tài liệu dường như nói rằng nó nên hoạt động, nhưng nó không.
Matt Cosentino

Với Safari 13.1, yêu cầu bị từ chối nhưng tôi không thể hiểu tại sao.
lunr

1
Vâng, nó thực sự bực bội. BTW Safari 13.1 bắt đầu hoạt động tương tự, nó dường như cung cấp quyền truy cập nhưng cài đặt cookie không thành công.
lunr

Như bài viết này chỉ định có một số quy tắc để cấp quyền truy cập. Và, không nên console.log('Now we have first-party storage access!');đến trong thencác requestStorageAccess()?
Supun Kavinda

@SupunKavinda 3 quy tắc đầu tiên không áp dụng ở đây. Tôi hoàn toàn không hiểu Quy tắc 5. Có lẽ nó đề cập đến một số cơ chế khác đã đưa vào danh sách đen tên miền. Tôi cũng không nghĩ điều này áp dụng nhưng tôi sẽ thử một vài thứ để xem nó có liên quan không.
lunr

Câu trả lời:


3

TL; DR

Đảm bảo rằng cookie đã được đặt cho tên miền trong ngữ cảnh của bên thứ nhất.


Có một vài điều cần chú ý với mẫu mã đó. Xin lưu ý những điều sau đây đã được thử nghiệm trên Safari 13.1.

Điều kiện nhắc nhở người dùng và cấp quyền truy cập tiếp theo:

  1. document.requestStorageAccessphải được gọi là kết quả của một hành động người dùng. Mặc dù như được ghi lại trên các tài liệu MDN , document.hasStorageAccessdường như không truyền bá hành động của người dùng.
  2. Người dùng phải tương tác với bên thứ ba trong bối cảnh bên thứ nhất. Bất kỳ nhấp chuột vào tài liệu sẽ làm.

Điều kiện để có thể viết một cookie:

Một cookie phải được đặt trên miền trong ngữ cảnh của bên thứ nhất. Cookie này có thể được máy chủ đặt làm tiêu đề phản hồi hoặc bởi JS bằng cách sử dụng document.cookie. Với một chút thử nghiệm, có vẻ như cookie này KHÔNG được đặt với cờ miền để đặt cookie tiếp theo trong bối cảnh của bên thứ ba. Điều này có nghĩa là trong thực tế, cookie hiện tại cũng phải được đặt trên cùng một tên miền phụ chính xác.


Cookies làm việc lấy các điều kiện này vào tài khoản. Nhưng có vẻ như bạn phải yêu cầu quyền truy cập mỗi lần, vì vậy chúng tôi thấy điều này không thể sử dụng được ngay bây giờ. Có lẽ chúng ta vẫn đang làm sai điều gì đó. Trong mọi trường hợp, chúng tôi quyết định làm điều này khác nhau. Cảm ơn.
lunr

@lunr bạn có thể chia sẻ kết quả không?
Serge Korzhov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.