programing

인증된 CORS 요청의 비행 전 OPTIONS 요청은 왜 Chrome에서는 작동하지만 Firefox에서는 작동하지 않습니까?

instargram 2023. 3. 13. 20:07
반응형

인증된 CORS 요청의 비행 전 OPTIONS 요청은 왜 Chrome에서는 작동하지만 Firefox에서는 작동하지 않습니까?

서드파티 사이트에 포함될 JavaScript 클라이언트를 쓰고 있습니다(Facebook Like 버튼을 생각해 주세요).기본적인 HTTP 인증을 필요로 하는 API에서 정보를 취득해야 합니다.간단한 설정은 다음과 같습니다.

서드파티 사이트의 페이지에는 다음과 같은 스니펫이 포함되어 있습니다.

<script 
async="true"
id="web-dev-widget"
data-public-key="pUbl1c_ap1k3y"
src="http://web.dev/widget.js">
</script>

widget.js는 API를 호출합니다.

var el = document.getElementById('web-dev-widget'),
    user = 'token',
    pass = el.getAttribute('data-public-key'),
    url = 'https://api.dev/',
    httpRequest = new XMLHttpRequest(),
    handler = function() {
      if (httpRequest.readyState === 4) {
        if (httpRequest.status === 200) {
          console.log(httpRequest.responseText);
        } else {
          console.log('There was a problem with the request.', httpRequest);
        }
      }
    };

httpRequest.open('GET', url, true, user, pass);
httpRequest.onreadystatechange = handler;
httpRequest.withCredentials = true;
httpRequest.send();

API는 적절한 헤더로 응답하도록 설정되어 있습니다.

Header set Access-Control-Allow-Credentials: true
Header set Access-Control-Allow-Methods: "GET, OPTIONS"
Header set Access-Control-Allow-Headers: "origin, authorization, accept"
SetEnvIf Origin "http(s)?://(.+?\.[a-z]{3})$" AccessControlAllowOrigin=$0
Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin

에 주의:Access-Control-Allow-Origin로 설정되어 있다.Origincredentialed 요구)를하고 있기 withCredentials를 참조해 주세요.

이제 비동기 교차 도메인 인증 요청을 만들 수 있는 모든 것이 준비되었으며 OS X 10.8.2의 Chrome 25에서 매우 잘 작동합니다.에서 Dev Tools에 을 볼 수.OPTIONSGET이치노

Firefox 19 에에 firefox 、 API 、 Firebug 、 firefox firefox에에에 。NS_ERROR_DOM_BAD_URI: Access to restricted URI denied

자세히 조사한 결과, Gecko는 코멘트에 따라 사용자 이름과 패스워드가 크로스 사이트 URI에 직접 들어가는 것을 허용하지 않는다는 을 알게 되었습니다.옵션 사용자 및 패스워드 파라미터를 사용한 것으로 알고 있습니다.open()「Base64」의 자격 정보 「Authorization」의 인증 정보입니다.

// Base64 from http://www.webtoolkit.info/javascript-base64.html
auth = "Basic " + Base64.encode(user + ":" + pass);

...
// after open() and before send()
httpRequest.setRequestHeader('Authorization', auth);

, 「」가 .401 UnauthorizedOPTIONS'''이러다'''이러다'''이러다을 사용법

Firefox가 아닌 Chrome에서 작동하는 이유는 무엇입니까?어떻게 하면OPTIONS관된 송송 ?? ??? ????

Firefox가 아닌 Chrome에서 작동하는 이유는 무엇입니까?

CORS 프리플라이트 요구의 W3 사양에는 사용자 credential을 제외해야 한다고 명시되어 있습니다.Chrome과 WebKit버그가 있습니다.OPTIONS상태 401을 반환하는 요청은 후속 요청을 계속 보냅니다.

Firefox에는 W3 퍼블릭 웹 앱 메일링 리스트 링크로 끝나는 관련 버그 파일이 있으며 인증 헤더를 전송할 수 있도록 CORS 사양을 변경할 것을 요구합니다.OPTIONSIIS の iis iis iis iis iis iis 。기본적으로 이러한 서버가 폐지되기를 기다리고 있습니다.

어떻게 하면OPTIONS일관된 송신과 회신을 요구합니까?

서버(이 예에서는 API)가 다음과 같이 응답하도록 합니다.OPTIONS인증을 필요로 하지 않습니다.

Kinvey는 브라우저 문제가 제기되기 몇 주 전에 이 정확한 시나리오의 catch-22 문제를 설명하는 Twitter API의 이슈에 링크하면서 이 문제를 잘 확장했다.

이것은 오래된 게시물이지만 아마도 이것은 사람들이 CORS 문제를 완성하는 데 도움이 될 것이다.기본적인 권한 부여 문제를 완료하려면 서버에서 OPTIONS 요청에 대한 권한을 피해야 합니다.다음은 Apache 설정 예입니다.Virtual Host 또는 Location에 이와 같은 것을 추가합니다.

<LimitExcept OPTIONS>
    AuthType Basic
    AuthName <AUTH_NAME>
    Require valid-user
    AuthUserFile <FILE_PATH>
</LimitExcept>

그것은 나에게 특별했다.'SESSIONHASH'라는 이름의 헤더를 보냅니다. Chrome과 Opera에는 문제가 없지만 Firefox에서는 "Access-Control-Allow-Headers" 목록에 이 헤더가 있어야 합니다.그렇지 않으면 Firefox가 CORS 오류를 발생시킵니다.

언급URL : https://stackoverflow.com/questions/15734031/why-does-the-preflight-options-request-of-an-authenticated-cors-request-work-in

반응형