SafariのStorage Access APIを使用してiframeにCookieを設定できません


9

ページにiframeがあります。SafariがサードパーティのCookieをブロックしているため、「開発者向けガイダンス」で以下の提案に従ってStorage Access APIを使用しようとしています。https//webkit.org/blog/10218/full-third-party-cookie-blocking-and-more /ドキュメントから次のコードをコピーしました:

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

ブラウザコンソールの出力:

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

ご覧のとおり、付与は成功したようですが、Cookieを設定できません。誰が何が悪いのか考えていますか?

Safariバージョン13.0.1

編集: Safari 13.1のコンソール出力:

[Log] hasAccess: false
[Log] error

注:囲んでいるページは、このページを指す単純なiframeタグsrcです。


1
同じ問題があります。ストレージアクセスは既存のCookieへのアクセスを許可するようですが、新しいCookieは保存されません。これは、「document.cookie」と「Set-Cookie」ヘッダーで返される新しいCookieの使用に適用されます。ドキュメントには、それはうまくいくはずだと書いてあるようですが、うまくいきません。
Matt Cosentino

Safari 13.1ではリクエストは拒否されましたが、その理由を理解できませんでした。
lunr

1
はい、本当にイライラします。BTW Safari 13.1は同じように動作し始めましたが、アクセスを許可しているようですが、Cookieの設定に失敗します。
lunr

この記事では、指定のアクセスを許可するためにいくつかのルールがあります。そして、ないはずconsole.log('Now we have first-party storage access!');で来るthenrequestStorageAccess()
Supun Kavinda

@SupunKavinda最初の3つのルールはここでは適用されません。ルール5を完全には理解していません。ドメインをブラックリストに登録している他のメカニズムを参照しているのかもしれません。これも当てはまるとは思いませんが、それが関連しているかどうかを確認するためにいくつかのことを試みます。
lunr

回答:


3

TL; DR

ファーストパーティコンテキストでドメインにCookieがすでに設定されていることを確認してください。


このコードサンプルには、注意すべき点がいくつかあります。以下はSafari 13.1でテストされています。

ユーザープロンプトの条件、およびその後のアクセス許可:

  1. document.requestStorageAccessユーザーアクションの結果として呼び出される必要があります。上で説明されているようにもかかわらず、MDNドキュメントdocument.hasStorageAccessユーザーのアクションを伝播していないようです。
  2. ユーザーは、すでにファーストパーティのコンテキストでサードパーティと対話している必要があります。ドキュメントをクリックするだけで十分です。

クッキーを書き込める条件:

Cookieは、ファーストパーティのコンテキストでドメインにすでに設定されている必要があります。このCookieは、サーバーが応答ヘッダーとして設定するか、JSがdocument.cookieを使用して設定できます。もう少しテストすると、サードパーティのコンテキストで後続のCookieを設定するために、このCookieにドメインフラグを設定してはならないようです。つまり、事実上、既存のCookieもまったく同じサブドメインに設定する必要があります。


Cookieはこれらの条件を考慮して機能します。しかし、毎回アクセスをリクエストする必要があるようですので、現時点ではこれは使用できません。多分私達はまだ何か他の間違ったことをしていました。いずれにせよ、これを別の方法で行うことにしました。ありがとう。
lunr

@lunr結果を共有できますか?
Sergey Korzhov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.