Задать вопрос

Способы объединенной аутентификации на ряде сайтов. Нужно что-то вроде распределенного OpenID

Дано: несколько веб-приложений. Это просто несколько копий одного приложения, которые запущены на разных поддоменах. Например: s1.myapp.com, s2.myapp.com, s3.myapp.com. Приложения между собой никак не связаны, т.е. запущены на разных физических серверах и у каждого своя база данных.
Авторизация на всех этих доменах одинаковая — по логину/паролю.

Задача: создать сайт вида help.myapp.com, который бы был доступен только юзерам, авторизованным на любом из приложений.

Мне пришли в голову следующие идеи:

1. Создание единого узла аутентификации (auth.myapp.com) и использование OpenID для аутентификации на help.myapp.com.
Минус: дополнительная работа по изменению архитектуры.

2. Ввод пароля непосредственно на help.myapp.com и запросы ко всем имеющимся базам данных с проверкой, есть ли хотя бы на одном из них такое сочетания логина/пароля.
Минусы: решение выглядит коряво. К тому же, пользователям прийдется вводить логин/пароль как на основном сайте их приложения, так и на сайте help'а.

3. Авторизация по referrer'у. То есть, если человек пришел по ссылке хотя бы с одного из допустимых сайтов, он автоматически получает доступ, а также, куки, запоминающие его как авторизованного.
Минусы: referrer можно очень просто подделать. К тому же, не будут работать прямые ссылки на странички help'а, если юзер не авторизован. Например, если кому-то прислали ссылку на help через скайп, человеку прийдется сначала переходить в help с его основного сайта, чтобы пройти аутентификацию, а потом уже открывать ссылку.

Есть ли другие способы? Можно ли что-то улучшить в приведенных выше?
Заранее спасибо.
  • Вопрос задан
  • 5118 просмотров
Подписаться 6 Оценить Комментировать
Решения вопроса 1
@edogs
Ставить авторизационную печеньку для *.myapp.com? Если задача правильно понята, то имхо это оптимальный способ.
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
philpirj
@philpirj
Вот тут уже задавался подобный вопрос, и пришли к единому мнению.
Ответ написан
@AigizK
Может в момент авторизации на любом из сайтов, паралельно его авторизовать на сайте auth.myapp.com? И тогда при заходе на help.myapp.com его перекидываем на auth.myapp.com и если он там уже авторизован, то авторизовываем и на help.myapp.com, а если еще не авторизован, то показываем поле логина и пароля. И когда пользователь вводит данные, совпадение логина с паролем ищем по базам всех сайтов.
Ответ написан
Stalker_RED
@Stalker_RED
как вариант:
На одном из сайтов (или на отдельном) устраиваете центр аутентификации. На всех страницах сайтов, если клиент еще не авторизован на сайте, запрашиваете яваскрипт из этого «центра».
Если клиент не авторизован в «центре» — сервер возвращает пустой файл, а если авторизован, то некоторый код, который распространяет авторизацию и на «дочерний» сайт (выставляет куки, редиректит, или что-либо еще).

Естественно не стоит забывать о безопасности, стоит ввести токены или что-либо еще.

Если все сайты — поддомены одного домена, то можно проставить общую куку.

Если сильно менять архитектуру слишком затратно, то можно разово собрать учетки со всех сайтов в единую базу (хотя бы потому, что так быстрее искать), и при добавлении новых пользователей отправлять копию на основной сервер (или синхронизировать базы, как вам удобнее).
Ответ написан
Anton_from_Amber
@Anton_from_Amber
1. Организуйте простую шутрую БД, в которую будете кидать ключ-логин-приложение и хранить закрытый ключ (код сессии например)
2. Открытый ключ на основе общего алгоритма (хеширование, соль, еще один закрытый ключ) отсылаете кукой клиенту)
В результате знаете уровень авторизации, откуда пришел в последний раз, что делал юзер или приложение. Каждое приложение автономно может работать со своим ключом в бд авторизации, так и править общий закрытый ключ. Можно SQL(MyISAM, Memory в MySQL), можно noSQL (memcache, redis, cassandra). Главное, что никто никому не завязывает руки.
Ответ написан
Комментировать
@1nd1go
Я думаю, вам также стоитт посмотреть в сторону: Single Sign-on
Ответ написан
Комментировать
сделайте провайдер openID, который автоматически авторизует ваши сайты… рано или поздно вы захотите еще один сайт прикрутить, а потом еще один сайт и т.д. Единая авторизация избавит вас в дальнейшем от многих проблем. И да — для пользователей еще один сервис «OpenID» будет только плюсом :-)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы