четверг, 25 сентября 2014 г.

OpenID авторизация через Wargaming.net. Django модуль для платформы GoogleAppEngine.

Вот тут находится модуль для Django, реализующий авторизацию через Wargaming OpenID на платформе Google App Engine. Действующая версия кода доступна по этому адресу.

Модуль представляет собой обертку над библиотекой demand.openid.net, при помощи которой можно реализовать как openid клиента, так и openid провайдера. Эта библиотека включена в состав модуля в виде zip-архива.

Для использования этого кода в вашем Django приложении нужно сделать три вещи.

1. Определить где-нибудь обработчик для события успешной авторизации пользователя в следующем виде:

 def success_handler(request, response, openid_url)  
где request и response это стандартные обьекта Django, а в openid_url передаются данные об авторизованном через Wargaming OpenID пользователе.

2. Подключить в ваш urls.py обработчики из модуля, и ваш обработчик события успешной авторизации из пункта 1. Примерно вот так:

urls.py
 urlpatterns = patterns('',  
   ...  
   url(r'^openid/', include('gae-openid.urls'), {'success_handler': module.success_handler}),  
   ...  
 )  
   

3. Подключить в ваш settings.py middleware из модуля. Примерно вот так:

settings.py
 MIDDLEWARE_CLASSES = (  
   ...  
   'gae-openid.middleware.OpenIDMiddleware',  
   ...  
 )  
   

Для точки входа на WG авторизацию в шаблонах Django можно использовать примерно такую конструкцию:

 {% url openid_start %}?continue=/&openid_identifier=https://ru.wargaming.net/id/  

Основой для модуля послужил код библиотеки google-app-engine-django-openid. Там мне не понравилось, что данные сессий openid авторизации хранятся в таблицах БД, и эти таблицы нужно периодически чистить. Данный код был переделан под сохранение данных openid сессий в memcache. Соответственно, убраны все функции обслуживания и очистки таблиц. Таблица в БД осталась только одна - для хранения данных об openid провайдерах, к которым обращались в процессе работы.

Кроме того, из запроса на авторизацию убраны все поля, которые обычно запрашиваются при штатной openid авторизации, но которые WG все равно не отдает (email и т.п.).

Если кому-то понадобится использовать этот модуль на обычном хостинге с Django, а не на аппенжин, то переделать нужно будет три вещи.

1. В модуле store.py переписать определение OpenID_Hosts как таблицы в обычной SQL БД, вместо таблицы в гугловской BigTable.

2. Там же заменить использование гугловского сервиса memcache (google.appengine.api.memcache) на подходящий для вас модуль мемкеша на вашем хостинге.

3. В модуле middleware.py заменить использование гугловского сервиса google.appengine.api.urlfetch на использование стандартных питоновых библиотек (urllib, urllib2). Это, по хорошему, и так нужно было сделать, но мне стало лень :)

Комментариев нет:

Отправить комментарий