Использование CORS для доступа к файлам cookie HTTP

У меня есть пользователь, который находится в домене A. Когда он делает запрос в домен A, я хочу, чтобы домен A связался с доменом B. Как только запрос попадает в домен B, я хочу, чтобы домен B получил доступ к файлам cookie HTTP, которые пользователь имеет в домене. B, а не в домене A. Возможно ли это сделать с помощью CORS?

Так что перефразировать.

  1. Посещения пользователей www.example.com
  2. Междоменный запрос выполняется из www.example.com -> www.example.net
  3. www.example.net проверяет файлы cookie HTTP ВКЛЮЧЕНО www.example.net и НЕ www.example.com для запрашивающего пользователя.

Очевидно, что из коробки это не работает. Я ищу безопасное решение, которое действительно работает.

Идея заключается в том, что я владею и www.example.com, и www.example.net, и я хочу входить в базу данных www.example.net, когда пользователь посещает www.example.com, ЕСЛИ у него есть определенный HTTP-куки, установленный на www.example.net.

ОБНОВЛЯТЬ

Я настроил CORS на тестовом серверном скрипте (www.example.net для целей этого примера):

<?PHP       
    header("Access-Control-Allow-Origin: https://www.example.com");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 60');    
    
    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
        
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            // may also be using PUT, PATCH, HEAD etc
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         
        
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
            header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
    
        exit(0);
    }
    
    echo "Cookie Dump: \n";
    echo print_r($_COOKIE);

А на www.example.com клиенте я просто использую fetch API:

<script>
  fetch("https://badge-dev.myfreecams.com/codex/auth.php", {
     method: 'GET',
     credentials: 'include'
   }).then(data => console.info(data));
</script>

Ошибок CORS нет. Если я зайду на серверный скрипт прямо в браузере, я увижу правильный дамп HTTP-куки на стороне клиента. Однако при загрузке www.example.com они не сбрасываются. Это означает, что я не могу делать то, что мне нужно, на своем сервере, www.example.net так как массив $_COOKIE пуст.

Вы пробовали через iframe?

Lessmore 11.12.2020 22:51

В example.com динамическом iframe с src для example.net, сгенерированном и добавленном к телу, вы можете получить доступ к example.net файлам cookie.

Lessmore 11.12.2020 22:58

@Lessmore Мне нужно больше информации, чтобы проверить это.

randombits 11.12.2020 23:16

чтобы попробовать прочитать о Access-Control-Allow-Origin: *dev.to/lydiahallie/cs-visualized-cors-5b8h мы сделали эту конфигурацию на нашем сервере nginx (или apache)

romanown 12.12.2020 00:32

Вы пробовали мое решение (iframe)?

Lessmore 14.12.2020 22:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
1 856
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В example.com у нас есть страница с iframe, который загружает страницу из example.net.

индекс.html:

<!DOCTYPE html>
<html lang = "en">
<body>
<iframe src = "http://example.net/log.php"></iframe>
</body>
</html>

А в example.net у нас есть .php файл для чтения и записи cookie (или всего, что вы хотите сделать с помощью cookie):

<?php
$visits = isset($_COOKIE['visits']) ? intval($_COOKIE['visits']) : 0;
var_dump($_COOKIE);
$visits += 1;
setcookie('visits', $visits, time() + 3600);

Некоторые примечания:

В моей среде разработки (Win10, Chrome 87) Chrome избегает межсайтовых файлов cookie. В Chrome 80+ добавлен новый атрибут в set-cookie под названием SameSite для улучшения конфиденциальности. Для получения дополнительной информации читайте это - SameSite

В вашем случае этот параметр должен быть None таким SameSite=None, а ваши домены должны быть https

в двух словах, ваша команда set cookie должна иметь ... Secure; SameSite=None, например:

header("Set-Cookie: key=value; path=/; domain=example.net; Secure; SameSite=None");

В моей среде разработки у меня нет https-доменов, поэтому я отключил chrome SameSite для своих тестов Отключение Google Chrome SameSite Cookie Enforcement

Если вы установите параметр учетных данных в запросе из разных источников, то будут включены файлы cookie для URL-адреса, на который делается запрос. Однако это приведет к предварительному запросу OPTIONS до того, как будет установлен запрос, включающий учетные данные.

fetch("//example.net/", {
    method: 'GET',
    credentials: 'include'
});

Я думал, что это тоже сработает, но когда я сбрасываю файлы cookie на сервер, он ничего не показывает. Если я напрямую обращаюсь к сценарию на стороне сервера, файлы cookie присутствуют. Ошибок CORS нет.

randombits 13.12.2020 20:39

Другие вопросы по теме