2012-02-26 2 views
1

인증을 위해 PHP 애플리케이션 (P)과 연결하고자하는 기존 Django 앱 (D)이 있습니다. 즉, 사용자가 D에 로그인하면 P의 서비스를 호출하여 암호를 확인합니다. 또한 로컬 사용자 계정으로 끝내야하며, D에 대한 속성을 저장해야합니다. 실제 보안 요구 사항은 매우 낮습니다. D가 P의 데이터베이스에 직접 액세스하는 것은 매우 어렵습니다.PHP에서 인증 API 구현하기

결코 모든 인증, 나는 이런 식의 생각을 구현 한 :

  1. D :
  2. D (P와 같은 알고리즘 사용) 사용자 이름 및 암호 연산 해시를 수집 : 전화 웹 서비스 (HTTP) P에서 사용자 이름과 해시를 전달하십시오.
  3. P : 사용자 이름을 조회하고, 존재하지 않으면 실패합니다.
  4. P : 그렇다면 전달 된 해시에 대해 저장된 해시를 확인하고 그렇지 않으면 실패합니다.
  5. P : 좋아, 그렇지 않으면 실패 반환, 사용자 (예를 들어, 이름, 일부 도메인 특정 물건)에 대한 다른 정보를 반환
  6. D : 확인을 작성하는 경우/사용자 레코드를
  7. D를 업데이트 : 확인하면, 그들을 로그인

을 따라서 몇 가지 질문 :.이 방법은 합리적인

  • 인가? 어떤 공격이 (클라이언트에게 알리기 위해) 취약합니까?
  • P : 인증 공급자에서 추가되는 기능은 무엇이라고합니까?
  • 표준 프로토콜을 사용하거나 최소한 웹 서비스 호출 이름을 사용하여 이러한 작업을 수행하는 표준 방법이 있습니까?
  • 6 단계는 합리적인 방법입니까? 이 방법으로 사용자 데이터베이스를 동기화 할 때 단점이 있습니까?
+0

서버가 PHP 응용 프로그램과 동일한 로컬 네트워크에 Django 응용 프로그램을 호스팅하고 있습니까? 아니면 인터넷을 통해 인증하고 있습니까? –

+0

같은 로컬 네트워크 (동일한 기관 내에서, 어쨌든). –

답변

0

두 서버가 동일한 기관/네트워크에 있다고 언급 했으므로 일반 HTTP 대신 HTTPS를 사용하는 경우 인증이 작동 할 수 있습니다. 당신이 당신의 장고 해시로 PHP 해시가 동일한 지 확인할 수없는 한

D: Collect username and password, compute hash (using same algorithm as P) 

, 난 당신을 통해 암호를 보낼 것을 권장합니다 (그러나 일반 HTTP를 통해, 포인트 2 참조).

Call web service (HTTP) on P, passing username and hash 

두 서버가 직접 연결되어 있는지 확실한 경우 일반 HTTP 만 사용해야합니다. 그렇지 않으면 (해시 된) 암호를 일반 웹 사이트로 전송하는 일반적인 웹 공격 (예 : Man-in-the-middle)에 취약합니다. PHP 응용 프로그램 측면에서 해시가 동일하다는 것을 직접 확인한다고 가정합니다. 네트워크 상태가 확실하지 않으면 HTTPS를 통해 웹 서비스를 호출하고 있는지 확인하십시오.

P: Look up username, fail if it doesn't exist. 
P: If it does, check stored hash against passed hash, fail if different. 
P: If ok, return some other information about the user (eg, full name, some domain-specific stuff), otherwise return fail 
D: If ok, create/update the user record 
D: If ok, then log them in. 

이 단계는 잘하지만, 당신이 두 개의 데이터베이스 사이의 일정한 사용자 동기화를 찾고 있다면, 당신은 당신 자신의 사용자 데이터베이스를 업데이트 할 수있는 방법을 찾아야합니다. PHP 응용 프로그램이 사용자를 비활성화/삭제하는 경우 장고 응용 프로그램은 해당 변경 사항을 선택해야합니다. 그렇지 않으면 삭제 된 사용자가 장고에 로그인 할 수 있습니다.(. 예를 들어, RabbitMQ) 사용자 상태가 같은

  • 는 메시징 시스템을 사용하는지 확인 모든 변경되도록하는

    1. 설문 조사마다 X 분/시간 :이 문제를 해결하는 방법은 두 가지가 있습니다

      PHP 쪽에서 장고 쪽에서 출판하고받을 것이다.

    다음 설문 조사 전에 사용자가 장고 쪽에서 계속 로그인 할 수 있기 때문에 첫 번째 방법은 간단하지만 효율적이고 안전하지 않습니다. 보안이 중요하지 않고 사용자 수가 적을 경우에 권장됩니다.

    두 번째 방법이 더 좋지만 동기화를 관리하기 위해 더 많은 코드를 작성해야합니다 (PHP 및 Django). 이 방법은 PHP 애플리케이션의 사용자 변경 사항을 거의 즉시 추적하고 데이터베이스에 반영 할 수 있기 때문에 훨씬 유용합니다. 사용자가 장고 앱을 사용하지 않으면 PHP 측에서 사용자 변경 사항을 무시할 수 있습니다 (따라서 귀하의 측면에 기록).