Меня тут долго не было… Ремонт… Новая работа… Кучу всего свалилось… Даже за сервак забыл заплатит. Так что спасибо Гугу, напомнил.
В первой части я рассказывал, как авторизовать человека по OpenID. В этой части я хотел предоставить свое виденье того, как это можно привязать к стандартной джанговской авторизации. Апп можно скачать тут
Кроме того, что мы хотим узнать, что текущий пользователь на сайте авторизуется через OpenID. Мы хотим его авторизовать по всем правилам Django. И чтобы авторизированный пользователь через OpenID был таким же как и через стандартную Django авторизацию. Т.е. попробуем прижить вместе несколько авторизаций.
Через массив бекендов у меня так и не получилось. Т.к. я хотел, чтоб у них был общий айдишник, и чтоб хранились они в общей таблице. Поэтому я просто расширил базовую авторизацию дополнительным функционалом. В последствии даже попробовал установить openid к уже рабочему проекту.
Для определения, к какой авторизации принадлежит я пользователя привязывал к группе. Название группы, к которой я привязывал пользователя можно положить в настройки проекта OPENID_GROUP по умолчанию это значение OpenID.
Код и условия далеко не идеальны, так что с удовольствием выслушаю конструктивную критику и предложения по изменению.
Сначала опишу процесс установки. На готовое, живое приложение.
1. Распаковываем файлы из архива в любую папку вашего проекта. К примеру в openidconsumer.
2. В установленные приложения проекта (INSTALLED_APPS) устанавливаем новое ‘openidconsumer’
3. Заменяем бекенд авторизации на наш наследник от базавого.
-
AUTHENTICATION_BACKENDS = ('django_openidconsumer.exauth.TypedModelBackend',)
4. В файле settings.py установим имя группы, которое будет определять, что пользователь авторизируется через OpenID. OPENID_GROUP = ‘openid_auth’;
5. Делаем инсерт в таблицу групп . По умолчанию у нее значение auth_group.
-
INSERT INTO auth_group(name) VALUES (‘openid_auth’);
6. В урлсы проекта urls.py прописываем урл, с которого будет проходить авторизация.
-
(r'^openid/',include('openidconsumer.urls'),{'on_success':vm.init_openid}),
Параметром on_success – мы указываем какая функция будет вызвана в случае удачной авторизации.
7. Пишем обработчик этой функции:
-
from openidconsumer import exauth
-
from django.http import HttpResponseRedirect
-
-
def init_openid(request,identity_url, openid_response,*args,**kwargs):
-
if exauth.openid_login_first(request,identity_url, openid_response):
-
return HttpResponseRedirect('/edit_profile/');
-
return HttpResponseRedirect('/');
тут все просто – либо идет редирект на /edit_profile/, в случае если пользователь зашел под своим OpenID url впервые , либо перебрасываем на главную
Если вы обратили внимание, то я убрал мидвере класс из предыдущего описания. В принципе там была передача в объект реквеста параметра OpenID. Я же ее добавил в объект юзера.
В принципе в зависимости от предыдущего описание модуля для работы с OpenID. Добавился файл exauth.py в котором и происходит расширение возможностей базавой авторизации и добавлены некоторые полезные функции.
Recent Comments