Python 将Cookie传递给HTTP,进入django中间件进行单点登录

Python 将Cookie传递给HTTP,进入django中间件进行单点登录,python,django,http,cookies,single-sign-on,Python,Django,Http,Cookies,Single Sign On,我需要为需要与第三方单点登录系统交互的django应用程序实现单点登录。此人开始登录到另一个系统,然后被重定向到django应用程序。django应用程序需要每隔几分钟检查一次此人的会话是否仍处于活动状态。这是通过进行HTTP GET调用并将所有cookie传递给HTTP GET请求来完成的,并且它在HTTP头中返回True或False 我将使用一个django中间件来构建它,该中间件跟踪用户上次检查身份验证的时间,如果超过了限制,我将ping服务器并确保该会话仍然有效。如果是,我继续,如果不是

我需要为需要与第三方单点登录系统交互的django应用程序实现单点登录。此人开始登录到另一个系统,然后被重定向到django应用程序。django应用程序需要每隔几分钟检查一次此人的会话是否仍处于活动状态。这是通过进行HTTP GET调用并将所有cookie传递给HTTP GET请求来完成的,并且它在HTTP头中返回True或False

我将使用一个django中间件来构建它,该中间件跟踪用户上次检查身份验证的时间,如果超过了限制,我将ping服务器并确保该会话仍然有效。如果是,我继续,如果不是,我将他们重定向回其他站点登录

两个站点位于同一个域下,因此我们都可以访问该域的所有cookie

既然你有了背景,我的问题是

使用头中传递的所有cookie调用HTTP GET的最佳方式是什么

在中间件中,我可以访问request.cookies中的所有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
它似乎工作不正常,我登录时总是出错,如果我通过浏览器执行get,我会得到一个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,这意味着它无论如何都是无效的。再一次,我不确定我是否正确设置了cookies

接下来我将尝试使用urllib2,我一直在避免使用它,因为它看起来有点过于适合我的口味,我会在收到结果后发布

我无法访问其他具有单点登录的系统,因此我无法查看日志或任何有趣的东西

编辑:添加了python请求示例和urllib2示例

python请求版本,它不会在请求头中设置cookies

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版本,看起来也不像是在请求中传递头中的cookies,我肯定是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())

欺骗Cookie不是SSO,它只是欺骗Cookie

这种“应该”的工作方式是,要么域cookie的到期日与会话到期日完全相同,要么存在某种哈希,其他应用程序可以使用该哈希来轮询SSO应用程序以了解用户的状态

如果你陷入困境,而SSO供应商告诉你这样做,我会认真质疑使用该供应商是否明智,或者至少回击一下,告诉他们提供一个不涉及应用程序模仿用户的解决方案


如果第三方不是“真正的”SSO,而您的客户/老板告诉您“我希望从站点a登录到站点B”,那么,嗯,向上销售,为他们解决此问题;-)

第三部分是我们的一个客户,已经为他们的其他合作伙伴和网站设置了此设置,我们必须为我们的产品使用相同的设置。我知道有更好的解决方案,但我们不能使用它们。我们没有发言权,我们必须使用他们提供的东西,即使它不理想。话虽如此,你知道如何解决我的问题吗?你能联系其他合作伙伴吗?我已经发了一封电子邮件,但没有回音,如果我没记错的话,我想大多数其他合作伙伴都在使用Java或.NET,所以我不确定这是否有帮助。