Мне нужно реализовать единый знак для приложения django, который должен взаимодействовать с системой единого входа сторонних производителей. Человек начинает вход в другую систему и перенаправляется в приложение django. Приложение django должно проверять каждые несколько минут, активен ли сеанс этого человека. Это делается путем вызова HTTP GET и передачи всех файлов cookie в запрос HTTP GET, и он возвращает значение True или False в заголовках HTTP.
Я собираюсь построить это с помощью промежуточного программного обеспечения django, которое отслеживает последний раз, когда у человека была проверена его аутентификация, и если оно превысит лимит, я буду пинговать сервер и удостовериться, что сеанс все еще действителен. Если это так, я продолжаю, если нет, я перенаправляю их обратно на другой сайт для входа.
Оба сайта находятся в одном домене, поэтому у нас обоих есть доступ ко всем файлам cookie для домена.
Теперь, когда у вас есть опыт, у меня такой вопрос.
Каков наилучший способ вызвать HTTP GET со всеми файлами cookie, передаваемыми в заголовках?
В промежуточном программном обеспечении у меня есть доступ ко всем файлам cookie из запроса. COOKIES
Я попробовал несколько основных попыток с использованием urllib и httplib2, но они, похоже, не работают. Прежде чем я потратил слишком много времени, я решил спросить, есть ли лучший способ сделать это.
Вот моя попытка httplib2
def httplib2_auth(auth_url, cookies):
""" Cookies is a dict of cookies from request.COOKIES in middleware """
http = httplib2.Http()
cookie_str = "; ".join("%s=%s" % (x, cookies[x]) for x in cookies if cookies[x])
headers = {'Cookie': cookie_str}
response, content = http.request(auth_url, 'GET', headers=headers)
if 'AUTHENTICATION-X' in response:
is_valid = response['AUTHENTICATION-X']
if is_valid == 'TRUE':
return True
return False
Кажется, это не работает правильно. Я всегда получаю False при входе в систему, если я получаю через браузер, я получаю True. Так может я неправильно настроил куки?
Вот моя попытка urllib
def urllib_auth(auth_url, cookies)
""" Cookies is a dict of cookies from request.COOKIES in middleware """
cookie_str = "; ".join("%s=%s" % (x, cookies[x]) for x in cookies if cookies[x])
opener = urllib.FancyURLopener()
opener.addheader("Cookie", cookie_str)
obj = opener.open(auth_url)
result2 = obj.read()
log.info("result = %s " % result2)
obj.close()
Я не уверен, как проверять заголовки, используя urllib, но тело всегда говорит false, что означает, что оно все равно недействительно. Еще раз, я не уверен, правильно ли я устанавливаю файлы cookie.
Далее я попытаюсь использовать urllib2, я избегаю его, так как он выглядит немного сложным на мой вкус, я опубликую результаты, когда получу их.
У меня нет доступа к другой системе, в которой есть единый знак, поэтому я не вижу журналы или что-то в этом роде.
EDIT: добавлен пример Python-запросов и пример urllib2
версия Python-запроса, он не устанавливает куки в заголовке запроса.
def requests_auth(auth_url, cookies):
cj = cookielib.CookieJar()
for x in cookies:
if len(cookies[x]) > 0:
ck = cookielib.Cookie(version=1, name=x, value=cookies[x],
port=None, port_specified=False, domain='.example.com',
domain_specified=True,
domain_initial_dot=True, path='/',
path_specified=True, secure=False,
expires=None, discard=True,
comment=None, comment_url=None,
rest=None, rfc2109=True)
#log.info(ck)
cj.set_cookie(ck)
log.info("cookies = %s " % cj)
response = requests.get(auth_url, cookies=cj)
log.info("response %s \n" % response)
log.info("response.headers %s \n" % response.headers)
log.info("response.content %s \n" % response.content)
версия urllib2, не похоже, что она передает файлы cookie в заголовке вместе с запросом, я, должно быть, делаю что-то не так с cookiejar
def urllib2_auth(auth_url, cookies):
log.info("[auth]")
cj = cookielib.CookieJar()
for x in cookies:
if len(cookies[x]) > 0:
ck = cookielib.Cookie(version=1, name=x, value=cookies[x],
port=None, port_specified=False, domain='.example.com',
domain_specified=True,
domain_initial_dot=True, path='/',
path_specified=True, secure=False,
expires=None, discard=True,
comment=None, comment_url=None,
rest=None, rfc2109=True)
log.info(ck)
cj.set_cookie(ck)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
req = Request(auth_url) # create a request object
handle = urlopen(req)
log.info("read = %s " % handle.read())
log.info("info = %s " % handle.info())