6

PHP로 수행 된 다이제스트 인증을 로그 아웃하는 방법이 있습니까?PHP 다이제스트 인증, 로그 아웃

설정을 취소했습니다. ($ _ SERVER [ "PHP_AUTH_DIGEST"]); 하지만 relogin을 요청하지 않습니다. 브라우저를 닫으면 작동하고 여기에 내 기능이 있는지 확인합니다.

function login(){ 
     $realm = "Restricted area"; 
     $users = array("jamesm"=>""); 
     if (empty($_SERVER["PHP_AUTH_DIGEST"])) { 
      header("HTTP/1.1 401 Unauthorized"); 
      header("WWW-Authenticate: Digest realm=\"{$realm}\",qop=\"auth\",nonce=\"".uniqid()."\",opaque=\"".md5($realm)."\""); 
      return false; 
     } 
     if (!($data = http_digest_parse($_SERVER["PHP_AUTH_DIGEST"])) || !isset($users[$data["username"]])) 
      return false; 
     $A1 = md5($data["username"] . ":{$realm}:{$users[$data["username"]]}"); 
     $A2 = md5($_SERVER["REQUEST_METHOD"].":{$data["uri"]}"); 
     $valid_response = md5("{$A1}:{$data["nonce"]}:{$data["nc"]}:{$data["cnonce"]}:{$data["qop"]}:{$A2}"); 
     if ($data["response"] != $valid_response) 
      return false; 
     return true; 
    } 
    function logout(){ 
     unset($_SERVER["PHP_AUTH_DIGEST"]); 
     return true; 
    } 

더 이상 로그 아웃 기능을 추가해야합니까?

영역을 변경하면 작동하지만 변경하지 않으려합니다.

+0

[PHP를 통한 HTTP 인증 로그 아웃] (http://stackoverflow.com/questions/449788/http-authentication-logout-via-php)이 중복되었습니다. 대답 : No. – netcoder

+0

나는 그것을 할 수 있다는 것을 알고있다. –

+0

정보가 브라우저 내에 등록되어 있기 때문에 브라우저를 닫는 유일한 방법입니다 – ajreal

답변

10

$ _SERVER [ 'PHP_AUTH_DIGEST'] 설정을 해제해도 아무런 효과가 없습니다. 문제는 설정 한 작업에 실제로 "좋은"대답이 없다는 것입니다.

HTTP 사양은 기술적으로 허용하지 않지만 실제로 다른 브라우저를 보내면 실제로 대부분의 브라우저가 효과적으로 "사용자를 로그 아웃"합니다. php.net/http-auth :

Netscape Navigator와 Internet Explorer는 서버 응답 401을 받으면 영역에 대한 로컬 브라우저 창의 인증 캐시를 지 웁니다. 이렇게하면 사용자를 효과적으로 "로그 아웃하여 사용자 이름과 암호를 다시 입력 할 수 있습니다 . 어떤 사람들은 로그인을 "타임 아웃"하거나 "로그 아웃"버튼을 제공하기 위해 이것을 사용합니다. 코드에서

는, 가장 간단한 방법은 아마 같은 것입니다 : 다시

function logout(){ 
    header('HTTP/1.1 401 Unauthorized'); 
    return true; 
} 

하지만, 이것은 실제로 HTTP 사양에 의해 찬성 것이 아닙니다.

+0

작동하지만 로그 아웃 페이지에서 로그인하라는 메시지가 나타납니다. 그것을 통해 로그인 할 수 없습니다. 사실, 나는 전혀 로그인 할 수 없다. 오, 괜찮아요. 다시 로그인 할 수 없어요. 또한 헤더 ("HTTP/1.1 401 Unauthorized") 만 제공해야했습니다. 아니 www - autherticate 다시. –

+0

알아두면 좋겠지 만, 다이제스트가 요구했는지 확신 할 수 없었습니다. 나는 아직 내 자신의 다이제스트를 구현하지 않았습니다. – TML

+0

나는 다음과 같은 것이 잘 작동한다는 것을 알았다 : http : // codepad.org/BUJvSmnm 필자의 경우 logout()에서 WWW-Authenticate 헤더를 필요로하는 적어도 하나의 브라우저 (Firefox 3.6)를 찾았으므로 생성 된 uniqid()를 $ _SESSION에서 사용하도록 유지하고 있습니다 로그 아웃 헤더에 있습니다. – TML

6

정답 : http://tools.ietf.org/id/draft-ietf-httpbis-p7-auth-12.txt - 섹션 6.1
신뢰할 수있는 방법은 없습니다.

일부 해결 방법은 401을 위장하여 realm =을 변경하거나 잘못된 자격 증명을 사용하여 AJAX 인증 요청을 승인하는 것입니다.

+0

이 IETF 초안 문서의 관련 섹션은 6.1입니다 : Authentication Credentials and Idle Clients – TML

+0

php code please? –

+0

@JamesM : 로그인 대화 상자를 표시하지 않으려면 jQuery를 통해이를 초기화해야합니다. 별도의'logout1.php '를 요청하십시오. 헤더 ("상태 : 401 로그 아웃")와 헤더 ("WWW- 인증 : 무효화, 기본 영역 = 로그 아웃")'을 보냅니다. 선택적으로 두 번째 AJAX 호출은'logout2.php'에 대한 잘못된 자격 증명을 사용하여 확인하지 않고 확인합니다. – mario