2013-02-26 1 views
6

기본적으로 Oauth2 프로세스를 시작하면 인증 된 로그인 폼이 있습니다. 액세스 토큰을 얻는 최종 리디렉션을 수행 할 때까지 완벽하게 작동합니다. 로그인 흐름은 다음과 같습니다. /user/login으로의 POST는 /user/oauth/auth으로 리디렉션되고 Oauth redirect_uri /user/oauth/redirect으로 리디렉션됩니다. redirect_uri는 결코 일어나지 않으며 요청은 결코 서버를 치지 않습니다.Safari Ajax cors가 리디렉션을 따르지 않기를 요청합니다.

Ajax 요청을 사용하여 해당 리디렉션에 도달하면 cors가 정상적으로 작동하고 두 번 리디렉션하는 경우에만 예상되는 응답이 발생합니다.

서버는 마지막으로 URL이의 히트 결코 이러한 응답

[I 130226 10:16:38 web:1462] 302 POST /user/login (192.168.1.5) 156.01ms (Session cookies set fine) 
[I 130226 10:16:38 web:1462] 200 OPTIONS /user/oauth/auth?scope=&client_id=DemoApp&response_type=code&redirect_uri=http://192.168.1.5:8443/user/oauth/redirect/code (192.168.1.5) 1.86ms 
302 GET /user/oauth/auth?scope=&client_id=DemoApp&response_type=code&redirect_uri=http://192.168.1.5:8443/user/oauth/redirect/code (192.168.1.5) 8.58ms 

을 보여줍니다. 서버가 내가 보는 웹 관리자의 요청

[I 130226 10:16:38 web:1462] 302 POST /user/login (192.168.1.5) 156.01ms 
[I 130226 10:16:38 web:1462] 200 OPTIONS /user/oauth/auth?scope=&client_id=DemoApp&response_type=code&redirect_uri=http://192.168.1.5:8443/user/oauth/redirect/code (192.168.1.5) 1.86ms 
302 GET /user/oauth/auth?scope=&client_id=DemoApp&response_type=code&redirect_uri=http://192.168.1.5:8443/user/oauth/redirect/code (192.168.1.5) 8.58ms 
[I 130226 10:27:12 web:1462] 200 GET /user/oauth/redirect/code?code=57497058fbbf6003310ea22d3902ac67 (192.168.1.5) 0.54ms 

에게 요청을보고하지만 jQuery를 사용 해요

enter image description here

처럼 사망을 제외하고 크롬, IE에서, 흐름 FF 동일 1.9 여기가 아약스 요청입니다 (I 시도하고 그것이 작동되도록하는 여기에서 태양 아래 모든 옵션을 가지고 부여.)

$.ajax({ 
    type: "POST", 
    url: reqUrl, 
    data: data, 
    dataType: "json", 
    success: function(data, textStatus) { 
      console.log(data); 
      alert('logged in'); 

    }, 
    error: function(e){ 
     console.log(e); 
    }, 
    complete: function(request, status) { 
     console.log("headers=" + request.getAllResponseHeaders()); 
    }, 
    statusCode: { 
    200: function(data) { 
     console.log('yup we got it.') 
    } 
    }, 
    xhrFields: { 
    withCredentials: true 
    }, 
    crossDomain: true, 
    async:true 
}); 

JSONP 초기 페이지와 같은 옵션을 선택하지 않습니다 ost는 https를 통해 전송되며 POST 요청이어야합니다. 다시 IE를 포함한 다른 모든 브라우저는 정상적으로 작동하고 성공 응답을 시작합니다.

Safari는 Statuscode 0과 고전적인 Origin 정책 오류 인 오류를 발생 시키지만, 리디렉션 uri는 로그인을 우회하는 표준 Ajax 요청에서 작동합니다. Safari가 방금 호출하면 호출이 작동하기 때문에 액세스 제어 문제라고 생각하지 않습니다.

리디렉션의 요청 헤더와 관련이 있으며 Safari가 요청을 중지하고 있음을 확신합니다. 최초의 성공적인 302 그들은이

Access-Control-Request-Method: GET 
Origin: http://192.168.1.5:9090 
Access-Control-Request-Headers: origin, accept-encoding, accept-language 

같이하지만, 리디렉션 URI에 그들은 (그 원인을 실패 왜에 관해서는 어떤 의미가 전송되는 접근 제어 헤더가 없습니다 그런데 왜 ??)과 같이

답변

5

이것은 사파리 일뿐입니다. 첫 번째 리디렉션 만 따라갈 것입니다. Apple은 이것이 HTML 사양이 쓰여지는 방식이라고 주장합니다. 그래서 .... /user/login으로 리다이렉트하지 않고 바로 oauth 프로세스를 시작하기 위해 내 흐름을 재 작업해야했습니다.

+1

"Apple이 HTML 사양을 쓰는 방법이라고 주장합니다." 원본을 인용 해 주시겠습니까? – hrdwdmrbl

+0

정말 늦은 답장 죄송합니다. 그것은 내가 Webkit에서 작동하는 엔지니어와 이야기하고있었습니다. 하지만 실제로 HTML5 사양입니다. 요청 원점을 null로 설정하는 것은 http://www.w3.org/TR/cors/ 사양의 일부입니다. 섹션 7.1.7의 6 단계를 참조하십시오. –

+0

JSONP는 선택 사항이 아니라 다른 도메인을 대상으로하는 것으로 알고 있습니다 ... 여러 도메인에서 여러 개의 리디렉션이있는 Safari에서 작동하는지 확인할 수 있습니다. – james

관련 문제