Pull to refresh

Велосипед: межсайтовая авторизация собственных проектов

Reading time2 min
Views2.7K
Это обсуждалось много и долго, напрмер в посте… Реализовал свой велосипед межсайтовой авторизации.

Итак, вернемся к задачи:
есть несколько оригинальных проектов (project1,project2,projectN...), для которых должна быть единая авторизация. То есть, Пользователь залогинившись в проекте project1 имел доступ к ресурсам project2...projectN как авторизованный пользователь.

Как правило, подобные проекты лежат на едином хостинге и желательно чтоб имели общую (единую) регистрацию. Итак, если эти условия выполняются, то нижеописанное решение может продолжить жизнь и в Вашем проекте.

Ограничение: все проекты лежат в одном датацентре и находятся в одной локальной сети. Все проекты имеют единое хранидище для сессий и соответственно единый sid.

Договоримся, что:
  • project.com — один из проектов.
  • sso.com — сервер общей авторизации.


Залогинивание

  • Пользователь на сайте project1.com жмет на ссылку Войти.
    *** Как вариант возможен пост на урл sso.com/signin/project1/#sid
    #sid — это номер сессиии
  • идет редирект на sso.com/signin/project1/#sid
  • Показывается дизайн сайта project1, дизайн проекта вычисляется по строке запроса
    *** Если был пост, то показывать дизайн проекта не надо и сразу приступаем к авторизации
  • Пользователь вводит логин и пароль
    *** Пункт не нужен если был пост
  • если авторизация успешна, то в мемкеш пишется сериализованный (в ввиде JSON) объет User,
    ключом выступает #sid
    далее идет редирект на урл project.com/welcome/#sid
  • делаем редирект на себя project.com/welcome без номера сессии (#sid)
  • если авторизация не успешна, то редирект на progect1.com/error/401 (Не авторизован)


Авторизация

  • Пользователь на сайте project1.com входит в любой раздел, который требует авторизации.
  • На сервере в мемкеше проверяется ключ, где ключом является выступает номер сессии.
  • Ключ существует, вытаскиваем все нужные данные из профиля (Объект User) и идем дальше
  • Ключ не существует, редирект на форму логина сервера авторизации sso.com/signin/project1/#sid


Авторизация с другого проекта

  • Пользователь на сайте project1.com входит в любой раздел, который требует авторизации.
  • sso.com кладет в мемкеш по ключу sid объект User
  • Пользователь переходит на project2.com/signin/#sid
  • На сайте project2.com проверяется, если существует ключ #sid, то далее идет доступ ко всем разделам сайта.


Выход

Убиваем ключ в мемкеше или он умирает сам

не лишний Вопрос

а что если «чужой» решит залогинится по урлу project1.com/signin/#sid используя твой sid

да, это вполне возможно… Перехватить sid в урле можно с такой же вероятностю, что и перехватить куку, в которой хранится обычный sid.

Заключение

Единая система регистрации предполагает, что пользователь регистрируется на sso.com
доступ к данным sso.com может быть из любого проекта. Все переходы при регистрации по аналогии с авторизацией, только урл другой: sso.com/registration/project1 (project1 показывает в каком дизайне отобразить регистрацию и куда вернуть порльзователя после регистрации)

Данные на sso.com можно (но вовсе не обязательно) хранить в key/value БД, например BerkleyDB.

PS. чтоб нас не выкидывало на форму логина слишком часто, надо использовать патч для мемкеша — autoprolongate ( про это в другом топике)
Данный патч делает автопролонгейт на такое же время после последнего обращение к данным.
Tags:
Hubs:
+2
Comments11

Articles

Change theme settings