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