Передача Cookies в HTTP GET внутри промежуточного программного обеспечения django для единого входа - PullRequest
1 голос
/ 02 августа 2011

Мне нужно реализовать единый знак для приложения 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())

1 Ответ

0 голосов
/ 02 августа 2011

Подмена cookie-файлов - это не SSO, это просто подмена cookie-файлов.

Способ, которым это «должно» работать, заключается в том, что либо истечение срока действия cookie доменного файла буквально совпадает с окончанием сеанса, либо существует какой-то хэшдругие приложения могут использовать для опроса приложения единого входа на предмет состояния пользователя.

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

Если третье лицо не является «действительно» SSO, и вы просто говорите клиенту / боссуВы: «Я хочу, чтобы логин с сайта A работал на сайте B», а затем проделал это, чтобы исправить это для них; -)

...