Ситуация
У меня есть три веб-сайта, которые раньше были одинаковыми.В результате они используют единую базу данных для администрирования пользователей и аутентификации.К сожалению, это очень разные веб-сайты, и они стали включать в себя совершенно разные функции.
Когда все три сайта были только одним сайтом, мы использовали изящный переключатель макета, который вводил запрошенный URL-адрес, чтобы определить, какие таблицы стилей использовать.Но если вы вошли в систему domain1.com
с пользователем из domain2.com
, сервер просто поменяет вам URL-адрес без проблем.
Поскольку мы добавили функции на один сайт, нам нужно было разделить все три системы на разные системы, чтобы не переступать через себя.Добавление функции к domain1
сломало бы несвязанную систему на domain3
, поэтому разделение было бы разумнее.Но мы сохранили ту же базу данных пользователей, потому что она привязана к нашим системам лицензирования и подписки.
Теперь мы хотим начать использовать SSL / TLS для защиты сайтов ... то есть они передаются через HTTPS, а неHTTP.
Используя HTTP, у нас не было особых проблем с перенаправлением пользователей с одной версии сайта на другую.Вы можете войти на любой из трех сайтов, сервер обнаружит, на каком сайте вы были предполагается , и выгонит вас туда.Поскольку мы используем State Server для управления сеансом, вы также ничего не потеряли при передаче (та же база данных пользователей, тот же идентификатор сеанса, тот же сеанс).
Используя HTTPS, мы теряем это, когдапинайте пользователей с одного сайта на другой.На данный момент лучшее, что мы можем сделать, это отобразить всплывающее окно и объяснить: «Вы хотели войти в систему domain2.com
... обновите свои закладки и войдите снова», прежде чем отправлять их в нужный домен.Это работает, но это не элегантное решение, расстраивает конечных пользователей, и оно на самом деле просто небрежно.
Идеальное решение
В идеале, пользователи должны автоматически входить на сайт, который они переносятчтобы когда-то они туда попали.Итак:
- Войдите в систему
domain1.com
с учетной записью пользователя от domain2.com
- Получите всплывающее окно с объяснением вашей ошибки и попросите обновить ваши закладки
- Быть автоматически переведенным на
domain2.com
и войти в систему, как если бы вы пошли туда с самого начала.
Оригинальный подход
Первая идея, которую мы должны были сделать, это перенаправитьпользователь и добавьте некоторый идентификатор к URL-адресу и извлеките соответствующий параметр GET, когда они попадут на новый сайт.Хотя это работает и мы можем войти в систему ... это очень небезопасно.Вы в основном создаете токен , которого любой может использовать для аутентификации в качестве этого пользователя и передачи его по проводам, где он может быть перехвачен и выдан.
Подход OpenID
ЧтоЯ думаю сейчас, и я даже не уверен, что это будет работать (отсюда и вопрос), это использовать какой-то вариант OpenID.И domain1.com
, и domain2.com
находятся на наших серверах, находятся под нашим контролем и используют наши сертификаты SSL.У нас есть полный доступ к базе данных, и, как только мы узнаем, какой сеанс восстанавливать, мы можем восстановить сеанс пользователя, выполнив вход в систему после перенаправления сайта.
Когда я использовал OpenID в прошлом, это занялоэтот формат:
- Перейдите на сайт AI, который хотите использовать, и нажмите Войти
- Переадресоваться на страницу входа на сайт B, где у меня уже есть учетная запись
- Войдите на сайт B и дайте разрешение сайту A использовать мою информацию
- Перенаправьте на аутентифицированную часть сайта A
Я хочу, чтобы наша система повторила шаги 3-4этого процесса.В основном:
- Перейдите на
domain1.com
и войдите (у вас уже есть учетная запись) - Прочтите сообщение об исправлении ваших закладок и нажмите OK, чтобы перейти на нужный сайт.
- Быть перенаправленным на аутентифицированную часть
domain2.com
Из того, что я уже готов к OpenID, это кажется возможным. И я уже пару дней читаю OpenID и OAuth, чтобы понять это. Но каждое решение, учебное пособие и руководство, которое я могу найти, описывает полностью отлаженный сервер OpenID. Нам не нужно, чтобы люди использовали внешние OpenID для аутентификации в нашей системе, и мы не хотим становиться поставщиком OpenID. Мы просто хотим создать решение, которое работает в соответствии с приведенным выше описанием.
Итак, возможно ли с использованием OpenID? Какие части протокола нам нужно будет уточнить, чтобы заставить его работать?