Как реализовать сервер аутентификации с единым входом? - PullRequest
3 голосов
/ 26 апреля 2009

Я хочу реализовать дискретный удаленный сервер аутентификации, который обрабатывает вход для многих сайтов. Несколько похоже на OpenID.

По сути, у меня есть site-1 и site-2, и они оба зависят от одной пользовательской базы данных, которая находится на отдельном auth-сайте. Таким образом, сайт авторизации обрабатывает аутентификацию пользователя для них и в ходе этого процесса делает информацию об аутентифицирующем пользователе доступной запрашивающей системе.

Каждый сайт может находиться на совершенно отдельном доменном имени, на совершенно разных машинах.

Это все через HTTP (S), прямой доступ к базе данных невозможен.

Есть еще одна странная особенность: после входа пользователя на сайт-1 при обращении к любому другому сайту, зависящему от auth-сайта, сайт должен рассматривать пользователя как уже аутентифицированного.

Весь этот бизнес должен быть полностью беспрепятственным для конечного пользователя. Он должен работать как простая ежедневная форма входа в систему.

В качестве конкретного примера, скажем, мы говорим о stackoverflow.com и serverfault.com, и они оба аутентифицируются с помощью authentic-overflow-server-stack.com. Опять же, войдя на один из сайтов, я могу перейти на другой и заняться бизнесом без повторного входа.

Что я хотел бы знать, так это общий механизм взаимодействия между сайтами, стоящими за этим сценарием.

В моей конкретной настройке я использую Rails, но я не ищу код [1], просто общие рекомендации и рекомендации, поэтому не стесняйтесь отвечать псевдокодом или любым общедоступным языком. OTOH, имейте в виду, что в моем наборе инструментов будут достойные MVC, REST и метапрограммирование.


[1]: если только вы не знаете существующее крошечное чистое бесплатное MIT / BSD-лицензированное приложение / плагин / генератор, который обрабатывает это.

Ответы [ 3 ]

2 голосов
/ 26 апреля 2009

Звучит так (особенно с акцентом на отсутствие суеты), вы хотите что-то вроде того, что делает Фонд Викимедиа. По сути, вы входите на en.wikipedia.org, затем этот сервер связывается с другими серверами (например, en.wikinews.org) и получает токены аутентификации. Наконец, эти токены встроены в изображения, например, http://en.wikinews.org/wiki/Special:AutoLogin?token=xxxxxxxxxxxxxxx, и когда ваш браузер посещает этот URL (img src), он получает файл cookie для аутентификации в Викиновостях. Конечно, исходный код доступен для вашего возврата в http://www.mediawiki.org/wiki/Extension:CentralAuth.

OpenID также является хорошим выбором, но он требует, чтобы пользователь «сознательно» посещал два домена. Примером одной сущности с двумя доменами, делающей это, является Canonical. Например, если вы перейдете на https://help.ubuntu.com/community/UserPreferences, они перенаправят вас на Launchpad (https://login.launchpad.net/+openid) для аутентификации.

Обратите внимание, что Википедия делает это через http, но вы можете сделать все это https, чтобы убедиться, что токены img src не перехвачены.

2 голосов
/ 30 апреля 2009

Похоже, CAS достаточно хорош для меня и имеет реализации ruby, а также десятки других менее значимых языков, например тот, который рифмуется с яростью бедренной кости.

1 голос
/ 26 апреля 2009

Похоже, вы действительно хотите использовать сам протокол OpenID. Нет никаких причин, по которым вы не можете ограничить провайдера аутентификации только своим собственным сервером и сделать несколько ярлыков, которые делают процесс аутентификации прозрачным. Кроме того, протокол OpenID поддерживает то, что вы описываете для входа в один, подразумевает вход во все сервисы.

...