2009-07-19 2 views
2

저는 장고에서 서비스로 작은 응용 프로그램을 만들고 있는데, 이제는 그것을 일부 클라이언트 PHP 웹 응용 프로그램에 통합 할 때입니다.Django 싱글 사인온 및 PHP 사이트 : 크로스 도메인 로그인?

고객 도메인 www.a.com의은 자신의 사용자를 인증하고 세션에 쿠키를 사용합니다.

내 도메인에 로그인 한 사용자도 내 장고 응용 프로그램 dommain www.b.com/clientA/에 로그인 할 수 있습니까?

내 도메인에서 reloggin을 만들고 도메인 A에서 인증 확인 인증을 사용하는 방법을 알았지 만 사용자가 www.a.com 및 www.b에서 로그인/패스를 두 번 입력해야 함을 의미합니다. com.

보안상의 이유로 도메인 www.a.com에서 쿠키에 액세스하는 것은 불가능합니다.

어떻게 처리할까요?

+0

PHP 응용 프로그램을 전혀 수정할 수 있습니까? – oggy

+2

BTW, 올바른 용어는 "Djangonauts" –

답변

7

다른 도메인의 쿠키에 액세스 할 수 없다고 가정하면 정확합니다. 그러나 하위 도메인에있는 경우 쿠키가 올바르게 설정되어 있으면 쿠키에 액세스 할 수 있어야합니다.

도메인을 완전히 분리해야하는 경우 조금 까다 롭습니다. 기존 PHP 코드를 수정할 수 없다면 거의 잊어 버릴 수 있습니다.

하나의 옵션은 OpenID를 사용하는 것입니다. PHP와 Python에서 OpenID 라이브러리를 사용할 수 있기 때문에 가장 간단한 방법 일 수 있습니다. OpenID는 인증과 같은 단일 사인을 허용하며 여러 사이트에서 이미 사용되고 있기 때문에 검증되고 작동합니다.

또 다른 옵션으로는 사용자 정의 싱글 사인온 시스템을 작성하는 것입니다.

기본 아이디어는 사용자가 사이트에 도착하면 로그인 사이트로 안내한다는 것입니다. 이것은 PHP 나 Python에서 끝나는 것이거나 분리 될 수 있습니다. 여기에서 사용자가 로그인 한 다음 로그인이 비밀 키를 생성합니다. 해시, 임의 문자열, 예상 할 수없는 한 무엇이든간에 사용자는 키를 사용하여 기본 사이트로 다시 리디렉션됩니다.

메인 사이트는 사용자에게 키가 있음을보고 사용자의 키를 확인하기 위해 로그인 사이트에 요청을 보냅니다.

사용자가 한 사이트에 로그인했습니다. 사용자가 두 번째 사이트를 방문하면 사용자가 로그인 사이트로 리디렉션됩니다. 사용자가 이미 로그인 했으므로 로그인 사이트는 사용자를 새로운 비밀 키로 리디렉션하고 두 번째 사이트는 로그인 사이트에서이를 확인하고 사용자는 다른 시간에 자격 증명을 입력하지 않고도 로그인합니다.

+0

클라이언트의 대부분은 이미 자신의 인증 스키마를 가지고 있으며 openid를 사용하지 않을 것이므로 너무 외계입니다. 세 번째 중앙 로그인 사이트가있는 마지막 솔루션을 좋아합니다. PHP 코드를 제공하지 않으면 클라이언트에서 너무 많은 변경이 필요할 것입니다. – coulix

+0

두 번째 옵션으로 클라이언트의 기존 PHP 인증을 사용할 수 있습니다. 비밀을 생성하고 다른 사이트와 대화 할 수 있도록 수정해야합니다. –

+0

하나의 작은 질문에 대해 잘 모르겠습니다.로그인 페이지에서 나에게 비밀 키를 부여하면 GET var로 원본 페이지로 전달됩니다. 이제 Ajax에서 로깅 페이지 도메인에이 키를 확인할 수 있는지 묻는 메시지가 표시됩니다. 그렇다면 유효 할 것인가? 내 도메인에 사용자를 어떻게 기록합니까? – coulix

1

HTTP 리디렉션을 앞뒤로 사용할 수 있습니다. 사용자가 www.b.com에 액세스하고 쿠키가 설정되지 않은 경우 www.a.com/crosslogin?return_to=URL&challenge=stuff으로 리디렉션합니다. a.com에서는 쿠키를 확인하고 쿠키가 설정된 경우 URL?verified=otherstuff으로 리디렉션됩니다.

사용자가 인증을 방지하지 못하도록하려면이 요청 - 응답 암호화가 필요합니다. a.com 및 b.com은 공유 된 비밀번호를 설정해야하며 그 비밀번호로 항목이 암호화됩니다. otherstuff은 또한 그 비밀로 암호화됩니다; 해독되면 튜플 (물건, 사용자)을줍니다. b.com은 otherstuff을 한 번만 사용할 수 있도록 재생 캐시를 유지해야 할 수도 있습니다.야니 Hartkainen로 열기를 사용하여 ID 제안

1) :

0

나는 다음과 같은 옵션을 참조하십시오. 그것은 최상의 해결책이 될 수 있습니다.

2) HTTP 역방향 프록시를 통해 하나 개의 도메인 사용 : PHP 애플리케이션과 동일한 도메인에 장고 응용 프로그램을 모두 넣어

를 사용하여 HTTP 역방향 프록시를. 이렇게하면 PHP 응용 프로그램의 세션 쿠키에 액세스 할 수 있습니다.

django 응용 프로그램에서 PHP 세션 ID를 얻으면 세션 쿠키를 사용하여 로그인 한 사용자를 확인하도록 PHP 응용 프로그램에 요청을 실행하십시오. 불행히도이 작업은 html 스크래핑 또는 PHP 응용 프로그램에서 간단한 서비스 구현이 필요할 수 있습니다. 로그인 한 사용자의 이름을 반환합니다. 로그인 한 사용자를 얻으면 장고 앱에서 권한을 부여 할 수 있습니다. GET을 통해 전달

3) PHP의 세션 ID :

은 장고 응용 프로그램에 대한 링크에 매개 변수로 세션 ID를 추가 할 PHP 응용 프로그램을 수정합니다. 당신이 2

6

좋아 점에서 설명한대로 사용자를 인증 할 수있는 세션 ID를 일단

<yourwebsite.com>/?client_session_id=<session_id>&client_name=<client_name> 

, 이것은 장고를 인증하는 방법은 다음과 같이 예를 들어 귀하의 웹 사이트를 참조하는 클라이언트 요청 PHP에서 사용자를 얻거나, PHP에서 장고 암호를 "읽는"방법.

나는 오픈 ID가 최선의 해결책이라고 생각하지만 오늘은 동일한 데이터베이스를 공유하는 PHP 응용 프로그램에서 장고 사용자를 인증했고 이것은 내가 해결 방법은 다음과 같습니다

<?php 

/* Generates crypted hash the same way as Django does */ 
function get_hexdigest($algorithm, $salt, $raw_password) { 
    if (!array_in($algorithm, array('md5', 'sha1'))) { 
     return false; 
    } 
    return $algorithm($salt.$raw_password); 
} 

/* Checks if password matches the same way Django does */ 
function check_password($raw_password, $django_password) { 
    list($algorithm, $salt, $hsh) = explode('$', $django_password); 
    return get_hexdigest($algoritm, $salt, $raw_password) === $hsh; 
} 

?> 

의 핵심은 형식을 이해하는 장고는 암호를 저장 : 그래서 예를 들어 나는 AUTH_USER 행의 암호는 "admin"과 "관리자"사용자 및 암호 필드를했다

[알고리즘] $ [소금] $ [해시]

:

sha1$63a11$85a93f217a72212b23fb0d5b95f3856db9575c1a 

알고리즘은 "sha1"이며 임의로 생성 된 소금은 "63a11"이고 암호화 된 해시는 "85a93f217a72212b23fb0d5b95f3856db9575c1a"입니다.

PHP에서 누가 암호 해시를 생성합니까? 당신은 간단 소금과 원시 비밀을 연결하고이 경우, SHA1의 알고리즘과 해시 :

<?php 

$salt = '63a11'; 
$pass = 'admin'; 

echo sha1($salt.$admin); // prints "85a93f217a72212b23fb0d5b95f3856db9575c1a" 

?> 

하는 것은 어렵지 않았다 그! Django 소스에서 관련 코드를 읽으면됩니다.