У меня есть несколько сайтов в разных доменах: example.com
, example.org
, mail.example.com
и passport.example.org
. Все сайты имеют общий внешний вид и
должен использовать одну и ту же пользовательскую базу.
И в таком крайнем случае я все еще хочу, чтобы все сайты были прозрачно (насколько это возможно) делиться сеансами пользователя со следующими ключевыми свойствами:
-
Единый вход. Когда пользователь подписывается на
passport.example.org
и посещает любой другой сайт - он должен рассматриваться как зарегистрированный.Записанные пользователи получают приветствие "Привет,
$username
" в заголовке сайта и разные меню навигации, список услуг, к которым они имеют доступ. Если он не вступил, вместо этого приветствия есть ссылка "Зарегистрироваться", указывая наpassport.example.org/signon
.Список доверенных доменов известен, поэтому это довольно просто реализовать либо с OpenID или с небольшим легким протоколом. Когда пользователь сначала сайт, я перенаправляю его на специальную конечную точку аутентификации в
passport.example.org
, который затем молча перенаправляет его обратно, с идентификационной информацией (или "не подписанной" ) анонимная личность). Для большинства браузеров это абсолютно прозрачно. Очевидно, что я использую значения nonce для борьбы с циклами перенаправления. -
Единый вход. Когда пользователь нажимает "подписаться" в заголовке любого сайта в следующий раз он посещает любой сайт - его следует рассматривать как "не подписываться".
OpenID не был разработан для этого. Моя нынешняя идея (у меня уже есть частично работающая реализация) заключается в отправке идентификатора пользователя, но "глобальный" токен сеанса и доля глобальная таблица сеансов (global_session_token ↔ отношение пользователя) в БД.
-
Поддержка роботов и cookieless-пользователей. Сайты имеют общественные зоны, которые должны быть доступным агентами-пользователями без поддержки файлов cookie.
Из-за этого перенаправление, о котором я упоминал в (1), становится проблемой, поскольку для каждый запрос страницы, я в конечном итоге бросаю user-agent на конечную точку и обратно. Это не только запутает роботов, но и загрязнит мою базу данных сеансов мертвые-на-рождения сессии очень быстро. И я определенно не хочу показывать "эй, у вас нет файлов cookie, выйдите! ", это было бы очень грубо и разочарование. Хотя мне требуется поддержка файлов cookie для входа в систему, я хочу, чтобы пользователи свободно читали для чего нужны сайты и т.д. - без каких-либо ограничений.
И я явно не хочу помещать идентификаторы сеанса в URL-адреса, за исключением некоторых прозрачных Перекрестные переадресации, о которых я говорил. Я считаю, что это проблема безопасности и просто вообще Bad Thing.
И здесь у меня почти нет идей.
Хорошо, я знаю, что это сложно, но Google действительно так или иначе делает это (google.com
,
google.
lot-of-gTLDs, gmail.com
и т.д.), правильно? Так что это должно быть
возможно.
Я был бы признателен за идеи описания протокола (это было бы лучше) или ссылки к системам (либо коду для чтения, либо только живым сайтам, чтобы смотреть и учиться) уже успешно реализуя что-то вроде этого.
Подводя итог: Несколько доменов без общего корня, общая пользовательская база, единый вход, однократная подписка, без файлов cookie, необходимых для анонимного просмотра.
Все сайты находятся в одной сети (но остаются на разных серверах) и частично совместно использовать одну и ту же базу данных PostgreSQL (отдыхая в разных схемах одной и той же базы данных). Большинство сайтов написаны с помощью Python/Django, но некоторые из них используют PHP и Ruby on Rails. В то время как я думаю о какой-то инфраструктуре и языке-агностике, я благодарен за указание на какие-либо реализации. Даже если я не смогу их использовать, если я получу идею, как это сделать, возможно, я смогу придумать что-то подобное.