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 애플리케이션에서 쿠키를 전송합니다. 나는 요청을 보낼 때 내가 사이트에 로그인했다는 것을 알지 못했다.
테스트를 위해 사용중인 브라우저는 무엇입니까? 다른 사람들에게 해봤습니까? Chrome [이 구문에 대한 지원 중단] (https://code.google.com/p/chromium/issues/detail?id=123150) (수정 : 더 나은 링크) 나는 그것이 스푸핑을 막기 위해 행해졌다고 생각한다.'http://www.google.com : secure @ example.com /' – Basic
나는 Safari와 HTTP 요청을 보내기위한 도구를 사용해 보았다. – donut
URL의 해당 부분을 적절한 승인 헤더로 바꾸는 것은 브라우저의 임무입니다. URL의 서버로 전송되지 않습니다. – Barmar