Как создать авторизацию на одном сайте по базе данных пользователей с другого сайта?
Я создал новостной ресурс (xxx.ru), на котором для комментирования нужно либо зарегистрироваться, либо авторизоваться через любую соц. сеть (используется uLogin).
Ещё у меня имеется популярный интернет-форум с 40k+ пользователей, которые тоже читают и этот новостной ресурс. Форум на IP.Board, домен отдельный от новостного ресурса (yyy.ru).
Хотелось бы на новостном сайте сделать следующее:
ЛИБО сразу делать авторизованными тех, кто уже авторизован на форуме, попутно внося в БД нового пользователя с форума на новостной сайт;
ЛИБО дать возможность авторизоваться пользователям через мой форум (т.е. написать мини-авторизацию, как у uLogin).
Как это лучше организовать?
С OpenID я пока не знаком и плохо себе представляю, что именно мне нужно написать на форуме и на новостном ресурсе, чтобы это связать. Подскажите, в каком направлении копать. :-)
Не получится просто сделать так, чтобы авторизованные пользователи форума могли быть автоматически авторизованы на другом домене. Если бы это было семейство поддоменов - тогда без проблем. Дело в политике безопасности сессионной куки.
В любом случае, если хотите привязываться к учёткам форума, то потребуется реализовать простейший API для авторизации и настроить кросс-доменный ajax, чтобы слать запросы прямо из клиентского javascript-а.
Алгоритм приходит в голову следующий:
- при заходе на сайт проверяется наличие сессионной куки
- если она есть, то посылается запрос на форумный API, чтобы проверить наличие связи id в куке с данными пользователя
- если связи нет или кука отсутствовала - пользователю показывается, что он разлогинен
- если связь есть - по API отсылаются нужные данные для показа на сайте.
Для авторизации в API передается логин-пароль, возвращается id той же сессионной куки, что используется на форуме.
Мне нужна авторизация немного другого плана. Нужно, чтобы на сайте xxx.ru клиент тыкнул в кнопку "авторизоваться через форум". Затем чтоб всплыло окошко с приложением на форуме, которое бы решало, залогинен человек на форуме или нет. И в случае, если он залогинен, посылало бы callback на мой сайт, что авторизация есть. Волнует только имплементация данной авторизация с точки зрения безопасности. Именно по такому принципу работает авторизация в uLogin.
@akubintsev В какой момент я должен установить на сайте xxx.ru сессию, которая будет совпадать с уже имеющимся ID сессии у IP.Board? То ли я вас не понимаю, то ли вы предлагаете делать лишнее действие.
@grigor в момент захода на любую страницу, идентифицирующую пользователя.
Зашли на главную страницу сайта, смотрим сессионную куку. Если есть: шлём запрос через ваш API в IP.Board на проверку соответствия сессионного идентификатора. Соответственно, я полагаю вы используете БД как хендлер сессий, чтобы упростить задачу. Совпадение есть? Шлём в ответ ник/фио/итд.
Я не знаю как ещё вам объяснить, всё просто.
Каким образом сессионная кука на сайте будет соответствовать ID-сессии от аккаунта на форуме? У форума свой механизм созданий кук и сессий. На xxx.ru и yyy.ru две совершенно разные базы данных с разными механизмами регистрации пользователей.
@grigor если на xxx.ru нет сессионной куки или ей не находится соответствия в БД форума, то вам потребуется через API авторизоваться. Успешная авторизация вернёт id новой сессии, которую вы установите для xxx.ru. Но естественно, что в таком случае зайдя сразу на форум пользователь увидит, что он не авторизован, поскольку для домена форума сессионную куку нельзя было поставить одновременно с xxx.ru.
Решение не самое красивое пожалуй, но более-менее нормальное с точки зрения трудозатрат.
Механизм я примерно с помощью easyXDM сделал такой: 1. Человек кликает ссылку "авторизоваться", открывается окно на другом домене и проверяется, есть ли авторизация на форуме. 2. Если авторизация есть, то с помощью easyXDM происходит callback запрос на изначальный домен с ответом "всё ок". Вопрос в том, как теперь реализовать механизм token'ов, чтобы это всё было предельно безопасно и без уязвимостей.
Всё, почти доделал. Механизм тот, что описан выше, только с consumer'а приходит только token, который создается в БД на yyy.ru. Затем xxx.ru проверяет наличие токена в БД yyy.ru и либо авторизует пользователя, либо заводит его в своей БД (если авторизация произошла в первый раз), либо отказывает в авторизации. Всё решил easyXDM. :)
А нет ли у вас ссылки на какой-нибудь туториал, как сделать oAuth авторизацию между двумя своими сайтами? Гугл выдает только авторизации между собственным сайтом и социалками.