0

새 앱을 개발 중이며 기본 인증으로 클라우드 스테이징 서버를 보호하기로 결정했습니다.PHP에서 nginx로 기본 인증 후 다이제스트 인증이 실패합니다.

나는 nginx를 사용하고, 그래서 설정은 다음과 같습니다

location/{ 
    auth_basic "Restricted"; 
    auth_basic_user_file .htpasswd; 
    try_files $uri $uri/ @php_mvc; 
} 

내 MVC 응용 프로그램도 HTTP 다이제스트를 사용하여 보호하는 "관리자"모듈이 있습니다 그래서

$realm = 'Access Restricted.'; 
$nonce = md5(uniqid()); 
$opaque = md5(uniqid()); 
$valid = false; 

$headers = System::getallheaders(); 
if (array_key_exists('Authorization', $headers)) { 
    $authHeader = substr($headers['Authorization'], strlen('Digest')); 
    $parsed = array(); 
    foreach (explode(',', $authHeader) as $pair) { 
     if (substr(trim($pair), 0, 4) == ($_u = 'uri=')) { 
      $parsed[substr($_u, 0, -1)] = trim(substr($pair, 5), ' "'); 
     } else { 
      $vals = explode('=', $pair); 
      $parsed[trim($vals[0])] = trim($vals[1], '" '); 
     } 
    } 

    $A1 = md5(self::DIGEST_USERNAME . ':' . $parsed['realm'] . ':' . self::DIGEST_PASSWORD); 
    $A2 = md5($_SERVER['REQUEST_METHOD'] . ':' . $parsed['uri']); 
    $response = md5($A1 . ':' . $parsed['nonce'] . ':' . $A2); 

    $valid = ($response == $parsed['response']); 
} 

if (!$valid) { 
    header('HTTP/1.1 401 Unauthorized'); 
    header('Content-Type: text/html'); 
    header(sprintf('WWW-Authenticate: Digest realm="%s", nonce="%s", opaque="%s"', $realm, $nonce, $opaque)); 
    echo 'Access denied.'; 
    exit(); 
} 

... 

function getallheaders() 
{ 
    $headers = null; 
    foreach ($_SERVER as $name => $value) { 
     if (substr($name, 0, 5) == 'HTTP_') { 
      $name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))); 
      $headers[$name] = $value; 
     } else if ($name == 'CONTENT_TYPE') { 
      $headers['Content-Type'] = $value; 
     } else if ($name == 'CONTENT_LENGTH') { 
      $headers['Content-Length'] = $value; 
     } 
    } 
    return $headers; 
} 

을 문제는 PHP 기반 다이제스트 인증이 작동하지 않는다는 것입니다. 그 이유는 $ _SERVER [ 'HTTP_AUTHORIZATION']이 (가) 기본 인증 결과에 이미 적용 되었기 때문입니다. $ _SERVER [ 'HTTP_AUTHORIZATION'] = "Basic S1aGUzpuZXzzdXRl".

기본 & 다이제스트 인증 결과를 분리 할 수있는 방법이 있습니까?

감사합니다.

답변

0

아니요. 서버와 백엔드 쪽에서 동일한 메커니즘 (모든 메커니즘에서 작동하지 않음)을 사용하거나 인증을 해제해야합니다.

후자 중 하나는 백엔드에 전원을 끄고 단지 (이 경우는 내부 네트워크에 인증을 우회하는 것이 가능) 서버에 의해 제공되는 사용자 이름을 신뢰한다는 것을 의미하거나 서버 측에서 전원을 끄고 보자 백엔드가 그 일을한다.

서버 및 백엔드에서 다른 사용자 이름/비밀번호를 사용하려는 경우 (사용자가 둘 다 입력해야 함) 백엔드에 html/쿠키/세션 기반 로그인 페이지를 구현하는 것만 선택할 수 있습니다 서버 측에서 http 기반 인증을 사용하십시오.