2011-08-02 1 views
1

제 3 사인 싱글 사인온 시스템과 상호 작용해야하는 장고 앱용 싱글 사인을 구현해야합니다. 그 사람은 다른 시스템에 로그인하기 시작하고 장고 앱으로 리디렉션됩니다. 장고 애플 리케이션은 그 사람의 세션이 여전히 활성화되어 있으면 몇 분 간격으로 확인해야합니다. 이 작업은 HTTP GET 호출을 수행하고 HTTP GET 요청에 모든 쿠키를 전달하여 수행되며 HTTP 헤더에 True 또는 False를 반환합니다.싱글 사인온 용 장고 미들웨어 내에서 HTTP GET으로 쿠키 전달

내가 장고 미들웨어를 사용하여 마지막으로 그 사람이 자신의 인증을 확인한 다음이 한계를 넘으면 서버를 핑 (ping)하고 세션이 여전히 유효한지 확인합니다 . 그렇다면 계속해서 다른 사이트로 다시 연결하여 로그인하십시오.

두 사이트가 모두 동일한 도메인에 속해 있으므로 도메인의 모든 쿠키에 액세스 할 수 있습니다.

배경 지식이 생겼으니 내 질문은 이것입니다.

머리글에 전달 된 모든 쿠키로 HTTP GET을 호출하는 가장 좋은 방법은 무엇입니까? 미들웨어에서

은 내가 URLLIB과 httplib2를 사용하여 몇 가지 기본적인 시도를 시도

request.COOKIES에서 모든 쿠키에 액세스 할 수 있지만, 제대로 동작하지 않습니다. 너무 많은 시간을 소비하기 전에, 나는 이것을 할 수있는 더 좋은 방법이 있는지를 물어 보았습니다.

은 여기가 내가 진정한를 얻을 브라우저를 통해 취득 할 경우, 로그인 내가 항상 거짓 얻을 제대로 작동하지 않는 것 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 

에서 내 시도이다. 어쩌면 내가 쿠키를 잘못 설정 한 것일까 요?

는 여기에 내가 URLLIB 사용하여 헤더를 확인하지만, 몸이 항상 어쨌든 유효하지 않습니다 즉, 거짓라고하는 방법을 잘 모르겠어요 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() 

에서 내 시도이다. 다시 한번, 쿠키를 올바르게 설정하고 있는지 확실하지 않습니다.

다음에 urllib2를 사용하려고합니다. 내 취향에 맞게 설계된 것 같아서 피하고 있습니다. 결과가 나오면 게시 할 예정입니다.

싱글 사인온을 사용하는 다른 시스템에 액세스 할 수 없기 때문에 로그 나 그 재미있는 것을 볼 수 없습니다.

편집 : 추가 된 파이썬 요청의 예와 urllib2가 예를

파이썬 요청 버전, 그것은 요청 헤더에 쿠키를 설정하지 않습니다. 이 중 하나를 요청 헤더에 쿠키를 전달하는 것처럼

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가 버전은 SSO없는 나는 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()) 

답변

0

스푸핑 쿠키 뭔가 잘못하고 있어야합니다, 보이지 않는 쿠키를 스푸핑하는 것일뿐입니다.

도메인 쿠키의 만료가 세션 만료와 같거나 다른 앱이 사용자 상태에 대해 SSO 앱을 폴링하는 데 사용할 수있는 일종의 해시가 있습니다.

SSO 공급 업체에서 이런 식으로 말씀하시는 경우 해당 공급 업체를 사용하는 방법에 대한 지혜를 의심하거나 적어도 다시 밀어 넣으십시오. 사용자를 사칭하는 앱이 필요합니다.

제 3자가 "실제로"SSO가 아니며 클라이언트/보스에게 "사이트 A에서의 로그인을 사이트 B에서 수행하고 싶습니다."라고 말하면 상향 조정할 수 있습니다. -)

+0

세 번째 부분은 이미 다른 파트너 및 웹 사이트에 대해이 설정을 사용하고 있으며 우리 제품에 대해 동일한 설정을 사용해야하는 고객의 클라이언트입니다. 더 나은 솔루션이 있다는 것을 알고 있지만 사용할 수 없습니다. 우리는 그들이 이상적이지 않더라도, 그들이 제공 한 것을 사용해야 만한다는 말은하지 않습니다. 그 말로, 내 문제를 해결하는 방법에 대한 아이디어? –

+0

다른 파트너 중 한 사람에게 연락 할 수 있습니까? –

+0

전자 메일을 보냈지 만 회신을받지 못했기 때문에 다른 파트너의 대부분이 Java 또는 .NET을 올바르게 사용하고 있다고 생각합니다. 따라서 도움이되는지 아닌지 잘 모르겠습니다. –