1

내 서버는 PHP를 CGI 모드로 실행하지 않습니다. 그리고 비록 내가 적절한 mod_rewrite stuff 설정 (이것은 Drupal 사이트 임)이었다.

내 문제는 사용자/패스가 http://user:[email protected] 형태의 URL을 통해 전달 될 때 $_SERVER의 값 중 하나에 나타나지 않는다는 것입니다. PHP_AUTH_USER이 아니고 이 아니고 REMOTE_USER이 아니거나 그 슈퍼 전역에있는 다른 곳이 아닙니다.

브라우저의 HTTP 기본 인증 대화 상자를 통해 또는 base64로 인코딩 된 Authorization: Basic ZXhhbXBsZTpleGFtcGxl HTTP 헤더를 통해 자격 증명이 전달되면 모든 것이 예상대로 작동하므로`$ _SERVER [ 'HTTP_AUTH_USER']가 채워지고 모든 사항이 정상입니다. 하지만 사용자/패스가 URL을 통해 전달되면 아무 것도 안됩니다.

여기에 무슨 일이 벌어 질지에 대한 아이디어가 있습니까?

PHP 5.3.10
아파치 2.2.22

+1

테스트를 위해 사용중인 브라우저는 무엇입니까? 다른 사람들에게 해봤습니까? Chrome [이 구문에 대한 지원 중단] (https://code.google.com/p/chromium/issues/detail?id=123150) (수정 : 더 나은 링크) 나는 그것이 스푸핑을 막기 위해 행해졌다고 생각한다.'http://www.google.com : secure @ example.com /' – Basic

+0

나는 Safari와 HTTP 요청을 보내기위한 도구를 사용해 보았다. – donut

+0

URL의 해당 부분을 적절한 승인 헤더로 바꾸는 것은 브라우저의 임무입니다. URL의 서버로 전송되지 않습니다. – Barmar

답변

1

TL; DR 다음 401 Unauthorized 응답 캐싱 그냥 올바른 자격 증명에도 불구하고 또 다시 캐시 인증 실패 응답을 전송하고, 없었다 인증 코드에 문제가 있었다 생각에 저를 위조. 캐싱을 비활성화하면 문제가 해결되었습니다.


컨텍스트를 들어, 이것은 API에 대한 모든이었다. 기본적으로 Drupal은 401 Unauthorized 응답을 포함하여 API의 응답을 적극적으로 캐싱했습니다. 그러나 인증에 실패한 이유가 캐싱으로 인한 것임을 알지 못했지만 응답에 부적절하게 캐싱되고 권한이 작동하지 않는 경우가 두 가지있었습니다.

실제 개발 중이었기 때문에 개발 환경에서 API 캐싱을 비활성화 한 다음 인증 문제를 해결하기 시작했습니다. 이미 해결했음을 알지 못했습니다. 디버깅 방법으로, API가 실제로 HTTP Basic Auth 자격 증명을 확인하지 않도록 응답을 단락했습니다. 디버그 정보 (주로 $_SERVER)가 표시됩니다. 서버가 더 이상 401 Unauthorized을 보내지 않았기 때문에 Safari는 사용자를 패키징하지 않았고 URL을 HTTP Authorization 헤더로 전달하지 않았습니다. 그러나 나는 아직 그것을 깨닫지 못했습니다.

그래서 Safari는 HTTP Basic Auth를 처리하기 위해 Apache를 사용하는 사이트의 URL을 사용자/패스하고 있지만 PHP API에서는 작동하지 않습니다. 이것은 아파치가 URL에서 인증을 먹고 그것을 보내지 않는다고 생각하게했다. 이 아이디어가이 질문을 창안 한 것입니다. 질문에 Basic 's 및 Barmar의 의견에

덕분에, 내 오류를 실현하고 실제로/URL에 전달하는 401 Unauthorized 상태 코드와 저와 - 보라, 사파리 사용자 일하던 전송 테스트했다.

API가 개발 된 Drupal 사이트에 로그인되어 있고 Drupal이 익명 사용자를위한 전체 페이지 캐싱 만 수행하기 때문에 API를 개발하는 동안 캐싱을 알지 못했습니다. 흥미롭게도 Chrome 앱인 Postman (별도의 애플리케이션처럼 동작 함)은 기본 Chrome 애플리케이션에서 쿠키를 전송합니다. 나는 요청을 보낼 때 내가 사이트에 로그인했다는 것을 알지 못했다.

0

http://httpd.apache.org/docs/2.2/howto/auth.html

유효한 사용자를 필요로하고 있는가? 이런 식으로

AuthType Basic 
AuthName "By Invitation Only" 
# Optional line: 
AuthBasicProvider file 
AuthUserFile /usr/local/apache/passwd/passwords 
AuthGroupFile /usr/local/apache/passwd/groups 
Require group GroupName 

당신이 관련을 httpd.conf 블록을 게시 할 수 있습니까?

+0

인증을 처리하기 위해 Apache를 사용하지 않고 PHP 만 사용합니다. 요청에 자격 증명이 아직 포함되어 있지 않으면 사이트는'401 Unauthorized '로 응답합니다. – donut