새 앱을 개발 중이며 기본 인증으로 클라우드 스테이징 서버를 보호하기로 결정했습니다.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".
기본 & 다이제스트 인증 결과를 분리 할 수있는 방법이 있습니까?
감사합니다.