Ответ 1
Мой подход обозначает один домен как "центральный" домен, а другие - как "спутниковые".
Когда кто-то нажимает ссылку "войти" (или представляет постоянный файл cookie для входа), форма входа в конечном итоге отправляет свои данные на URL-адрес, который находится в центральном домене, вместе со скрытым элементом формы, указывающим, в каком домене он пришел от (просто для удобства, поэтому пользователь перенаправляется обратно).
Затем эта страница в центральном домене переходит к настройке сеансового файла cookie (если логин прошел успешно) и перенаправляет обратно в любой домен, в который пользователь вошел, со специально созданным токеном в URL-адресе, который является уникальным для этого сеанса.
Затем страница на спутниковом URL проверяет этот токен, чтобы узнать, соответствует ли он токен, который был сгенерирован для сеанса, и если это так, он перенаправляет себя без токена и устанавливает локальный файл cookie. Теперь, когда в спутниковой области есть файл cookie сеанса. Эта переадресация очищает токен от URL-адреса, так что маловероятно, что пользователь или любой искатель будет записывать URL-адрес, содержащий этот токен (хотя, если это так, это не имеет значения, токен может быть одноразовым токеном).
Теперь пользователь имеет cookie сеанса как в центральном домене, так и в спутниковой области. Но что, если они посещают другой спутник? Как правило, они будут отображаться на спутнике как не прошедшие проверку.
Тем не менее, во всем приложении, когда пользователь находится в действительном сеансе, все ссылки на страницы на других спутниковых доменах имеют к ним присоединенные или с. Я оставляю эту "строку запроса" равной "проверке с центральным сервером, потому что мы считаем, что у этого пользователя есть сеанс". То есть, ни один токен или идентификатор сеанса не отображаются на любой HTML-странице, а только буквы, которые не могут идентифицировать кого-либо.
URL-адрес, получающий такой тег запроса 's', будет, если еще не существует действительного сеанса, перенаправляет на центральный домен, говоря: "Можете ли вы сказать мне, кто это?" помещая что-то в строку запроса.
Когда пользователь приходит на центральный сервер, если они аутентифицированы, центральный сервер просто получит их cookie сеанса. Затем он отправит пользователя обратно на спутник с другим одноразовым токеном, который спутник будет рассматривать так же, как спутник после входа в систему (см. Выше). Т.е., теперь спутник настроит cookie сеанса в этом домене и перенаправит на себя, чтобы удалить токен из строки запроса.
Мое решение работает без поддержки script или iframe. Для этого требуется, чтобы '? S' добавлялось к любым междоменным URL-адресам, где у пользователя еще нет cookie с этим URL-адресом. Я подумал о том, как обойти это: когда пользователь впервые войдет в систему, настройте цепочку перенаправления вокруг каждого отдельного домена, установив cookie сеанса на каждом из них. Единственная причина, по которой я не реализовал этого, заключается в том, что было бы сложно, потому что вам нужно было иметь установленный порядок, в котором эти переадресации произойдут и когда остановиться, и не позволит вам расширять пределы до 15 доменов или так (слишком много больше, и вы становитесь опасно близкими к "пределу перенаправления" многих браузеров и прокси).