Добрый день!
Делаю единый центр регистрации и авторизации SSO на протоколе CAS 3.0.
Для этого использую:
django-cas-serverdjango-registration
Например,
Есть три сервиса:
1) service1.com
2) service2.com
3) service3.com
Сам CAS сервер:
cas.service.com
CAS сервер, точки входа:
1) /before-login/ - запрос email - поиск пользователя - если нашел - отправляем на /login/
2) /login/ - если пользователь авторизован на CAS и имеются параметры с какого сервиса пришел, авторедирект его в сервис.
Логика такая:
1) Не зарегистрированный пользователь заходит на любой из этих сервисов, нажимает на "Войти или Зарегистрироваться" и его редиректит по GET на CAS сервер(/before-login/ ).
2) Попадает на CAS сервер(вместе с запросом, приходят данные: с какого сервиса, с какой страницы)
3) CAS сервер просит e-mail, пользователь вводит, нажимает Submit.
4) CAS сервер ищет пользователя по e-mail, если находит - просит ввести пароль, а если не находит - то на регистрацию.
5) Пользователь вводит регистрационные данные, нажимает Submit, уходит письмо с ссылкой на активацию(в эту ссылку вшиваем код и в виде параметров, какой сервис и с какой страницы пришел пользователь)
6) Пользователь переходит по этой ссылке - его аккаунт активируется. После этого, мы его авторизуем в ручном режиме(мы же хотим минимум действий от пользователя) и записываем ему в сессию параметр authenticated:
self.request.session["authenticated"] = True
и после этого отправляем его на урл логина сервиса с которого он пришел(Что бы получить правильный тикет от сервиса к CAS серверу), с этого УРЛА его естественно, перенаправляет на CAS (/login/) также с параметрами, с какой страницы пришел и с какого сервиса.
И тут должна произойти магия:
Так как мы авторизовали пользователя до этого вручную, значит пользователь должен автоматом вернуться в сервис авторизованным. Но авторизация сбрасывается, а точнее сессия.
Но если не вставить self.request.session["authenticated"] = True, то CAS останавливается на /login/, показывает что пользователь авторизован, но редирект не происходит, потому что в сессии не стоит authenticated = True.
self.request.session["authenticated"] ее проверяет django-cas-server
Прошу прощения, за много букв и сумбурное изложение.
Что я пытался:
Про бывал обновлять hash сессии, после того как я вставлю в него authenticated.