Найти - Пользователи
Полная версия: Кастомная авторизация на Django.
Начало » Django » Кастомная авторизация на Django.
1
bigramx
Доброго времени суток!

Подскажите как решить следующую проблему:
На домене http://www.abcd.ru/ есть авторизационный субдомен http://auth.abcd.ru/, которые авторизует пользователя по логину и паролю и выдаёт ему куки на весь домен .abcd.ru. По запросу к авторизационному серверу с логином и паролем по обычному POST протоколу он проверяет авторизацию и выдаёт результат в виде xml.

На субдомене http://test.abcd.ru/ разрабатывается django приложение. Подскажите как можно сделать (или где почитать) про реализацию в django такого механизма:
При каждой загрузке страницы проверяются куки, выбирается из кукисов сессия юзера. Если сессия указана в кукисах, то отправляется запрос на авторизационный сервер http://auth.abcd.ru/. По возвращаемому xml определяется валиодность авторизации юзера и в зависимости от этого он считается авторизованным или не авторизованным.

Заранее благодарю за помощь.
Александр Кошелев
bigramx
По запросу к авторизационному серверу с логином и паролем по обычному POST протоколу он проверяет авторизацию и выдаёт результат в виде xml.
Надо понимать, что ещё и по куке?
bigramx
Подскажите как можно сделать (или где почитать) про реализацию в django такого механизма:
Cделать обычную middleware примерно такого вида:

def parse_response(response):
# тут парсится xml и определяется статут
pass

def call_auth_server(cookie):
from urllib2 import urlopen

# Либо просто прокидывать куку, прикидываясь клиентом.
# Зависит от реализации.
response = urlopen('http://auth.abcd.ru/', data={'cookie': cookie})

return parse_response(response.read())

class AuthMiddleware(object):
def process_request(self, request):
cookie = request.COOKIES.get('my_session_cookie')
if cookie:
request.user_authenticated = call_auth_server(cookie)
else:
request.user_authenticated = False
bigramx
Daevaorn
Надо понимать, что ещё и по куке?
Нет, зачем? Куки висят одни на весь домен. В куках только id юзера и id сессии. Ничего криминального вроде нет. Просто в POST запросе отправлять два параметра user_id и sess_id как обычные POST данные. Авторизационный сервер сам проверяет полученные данные и смотрит, получал ли юзер с таким ID сессию с таким ID. Если да, то возвращает инфу о юзере в xml, если нет, то возвращает в этом же xml ошибку.

Может я чего не додумал и в этом методе есть потенциальные косяки, которые потом могут вылезти боком? Другого метода единой авторизации для домена и всех субдоменов я не смог придумать…

Daevaorn
Cделать обычную middleware примерно такого вида:
Спасибо, вот эта штука реально очень помогла продвинуться в решении задачи. Почти всё сделал! ))
Александр Кошелев
bigramx
Нет, зачем? Куки висят одни на весь домен. В куках только id юзера и id сессии. Ничего криминального вроде нет. Просто в POST запросе отправлять два параметра user_id и sess_id как обычные POST данные. Авторизационный сервер сам проверяет полученные данные и смотрит, получал ли юзер с таким ID сессию с таким ID. Если да, то возвращает инфу о юзере в xml, если нет, то возвращает в этом же xml ошибку.
Ну так значит всё-таки по куке?:-) В исходном сообщении вы сказали что это сервер проверяет авторизованность по логину и паролю, и было бы странно при каждом запросе их спрашивать у пользователя. Следовательно авторизационный сервер может проверять залогиненность и по куке. Что вы собственно в этом абзаце и подтвердили.
bigramx
Daevaorn
Ну так значит всё-таки по куке? :-) В исходном сообщении вы сказали что это сервер проверяет авторизованность по логину и паролю, и было бы странно при каждом запросе их спрашивать у пользователя. Следовательно авторизационный сервер может проверять залогиненность и по куке. Что вы собственно в этом абзаце и подтвердили.
А, ну да, сорри, не так Вас понял просто. ))) Кстати, всё уже заработало, огромное спасибо за помощь! В скором времени уже смогу показать для чего мне это было нужно. ))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB