Настройка междоменных файлов cookie в Safari - PullRequest
55 голосов
/ 03 января 2009

Букмарклет Evernote может сделать это, поэтому наиболее одобренный ответ не отвечает на это, даже если щедрость пойдет на это (непродуктивно).

Мне нужно позвонить домену A.com (который устанавливает куки с http) из домена B.com. Все, что я делаю на домене B.com (javascript):

var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = "A.com/setCookie?cache=1231213123";
head.appendChild(script);

Это устанавливает cookie на A.com во всех протестированных мной браузерах, кроме Safari. Удивительно, но это работает в IE6, даже без заголовков P3P.

Есть ли способ заставить это работать в Safari?

Ответы [ 18 ]

0 голосов
/ 03 января 2009

Вас не раздражает отсутствующий атрибут типа? -)

<script type="text/javascript">
  var head = document.getElementsByTagName("head")[0];
  var script = document.createElement("script");
  script.setAttribute("type","text/javascript");
  script.src = "A.com/setCookie?cache=1231213123";
  head.appendChild(script);
</script>
0 голосов
/ 13 августа 2018

Поместите этот JavaScript на страницу, выполняющую междоменные запросы, http://example1.com/index.html:

  <script>
  var gup = function(name, url) {
     if(!url) url = location.href;
     name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
     var regexS = "[\\?&]"+name+"=([^&#]*)";
     var regex = new RegExp( regexS );
     var results = regex.exec( url );
     return results == null ? null : results[1];
  }
  var isSafari = navigator.vendor && navigator.vendor.indexOf('Apple') > -1 && navigator.userAgent && !navigator.userAgent.match('CriOS');
  var n = gup("activated");
  if(isSafari && n == null) {
     //browser is Safari and cookies have not yet been activated
     var current_url = location.protocol + '//' + location.host + location.pathname;
     var query_string = '?callback=' + encodeURIComponent(current_url + '?activated=1');
     var new_url = 'http://example2.com/activate.php' + query_string;
     window.location.href = new_url;
  }
  //the rest of your code goes here, and you can now set cross-domain cookies on Safari
  </script>

Затем создайте файл на другом сервере, для которого нужно установить куки, http://example2.com/activate.php:

  <?php
  if(isset($_GET['callback'])) {
     header('Location: '.$_GET['callback']);
     exit();
  } else {
     //in case callback param is not set, simply go back to previous page
     echo "<script>";
     echo "window.history.back();";
     echo "</script>";
     exit();
  }
  ?>

Вот как это работает:

  1. При первом посещении http://example1.com/index.html выполняется проверка, чтобы определить, является ли браузер Safari и не существует GET-параметра с именем «активировано». Если оба условия выполнены (что произойдет при первом посещении браузера Safari), то браузер будет перенаправлен на http://example2.com/activate.php с параметром GET «callback», содержащим URL-адрес вызывающего абонента, добавленный с «активированным» параметр.

  2. http://example2.com/activate.php просто перенаправляет обратно на URL-адрес, содержащийся в параметре GET, «обратный вызов».

  3. Когда http://example1.index.html теперь нажимается во второй раз после перенаправления на, теперь будет установлен параметр GET, «активирован», поэтому условие с шага 1 не будет выполнено, что позволяет скрипт для продолжения выполнения.

Это соответствует требованию Safari о том, чтобы браузер хотя бы раз посещал сторонний домен, чтобы начать установку файлов cookie.

0 голосов
/ 08 июня 2018

Стоит отметить, что это ограничение в Safari не распространяется на субдомены. Поэтому, если вы заходите на сайт sitea.com напрямую, вы можете установить файлы cookie с subdomain.sitea.com без непосредственного взаимодействия с пользователем (iframe / JavaScript).

Это было актуально для моего случая при разработке API. Если вы посещаете сайт mysite.com и хотите, чтобы какой-то JavaScript взаимодействовал с вашим API, то если API размещен на api.mysite.com, он будет работать в Safari.

0 голосов
/ 30 января 2016

Я нашел простое решение. Вам просто нужно в первый раз установить cookie, чтобы проверить, поступил ли запрос из того же источника или нет, если не так, как обычно, вам нужно вернуть в iframe скрипт, который будет повторять этот запрос, уже имея разрешение на назначение cookie. После этого вы можете сделать другой запрос напрямую через iframe, обращаясь к этому cookie. Это помогло мне в моей системе отслеживания. Попробуйте, это хорошо работает.

0 голосов
/ 28 января 2009

Возможно, прагматично создать и щелкнуть ссылку с href="A.com/setCookie?cache=1231213123" и целевым атрибутом, указывающим на скрытый фрейм. То, что может обойти политику Safari в отношении навигации пользователей для настройки файлов cookie (у меня нет Safari, удобной для тестирования.)

0 голосов
/ 02 февраля 2009

Попробуйте что-то вроде:

var w = window.open("A.com/setCookie?cache=1231213123");
w.close();

Может обойти политику безопасности сафари.

0 голосов
/ 04 февраля 2009

Я провел обширное расследование по этому поводу, когда пытался развернуть сайт, использующий идентификатор Windows Live ID, который зависел от возможности устанавливать сторонние файлы cookie для выхода из системы. Это просто ... не сработало. Ничто из того, что мы могли сделать, не заставило бы его работать. Команда Live ID также провела тщательное расследование, и ее ответ был «не могу заставить его работать».

0 голосов
/ 28 июля 2009

Обратите внимание на эту строку:

script.src = "A.com/setCookie?cache=1231213123";

Я не мог заставить это работать, пока я не добавил http, то есть

script.src = "http://A.com/setCookie?cache=1231213123";
...