2017-02-03 2 views
1

다음 각도 2 HTTP 요청이 있습니다. 요청 때문에 플라이트의 서버 OPTIONS로 끝나는대로 각도 2 CORS 문제

const endpoint = '<auth_url>'; 
 
const body = { 
 
    prompt: 'consent', 
 
    grant_type: 'authorization_code', 
 
    redirect_uri: '<redirect_url>', 
 
    code: '<authorization_code>' 
 
}; 
 

 
const headers = new Headers(); 
 
headers.append('Authorization', 'Basic <auth>'); 
 
headers.append('Content-Type', 'application/x-www-form-urlencoded') 
 

 
const options = new RequestOptions({ headers }); 
 

 
this.http.post(endpoint, body, { headers: headers }) 
 
.map(res => res.json()) 
 
.subscribe(
 
    data => console.log(JSON.stringify(data)), 
 
    error => console.error(JSON.stringify(error)), 
 
() => console.log('Request complete') 
 
);

가 ExpressJS 인스턴스에 부착 된 node-oidc-provider에 연결되어, I는 데 문제가 CORS으로한다. 위의 그림과 같이 Content-Type 헤더를 지정 했으므로이 경우가 아니어야합니다. Annoyingly 나는이 문제가 서버 또는 내 Angular2 코드인지 알아 내려고 노력하고 있습니까?

ExpressJS 응용 프로그램에서 CORS를 명시 적으로 활성화해야하고 그렇지 않은 경우 POST에서 올바른 헤더를 설정하면 아무런 영향을주지 않는 이유는 무엇입니까?

+1

처럼 보이게하는 방법입니다. JS에서 할 수있는 것은 아무것도 없습니다. 따라서 Angular도 할 수 없습니다. 경우에 따라 JSONP를 사용하여 작업 할 수도 있지만 상당히 제한적입니다. –

+0

고마워요, 아래의 답변에 대한 내 의견을 참조하십시오 – MindVox

답변

2

예, 서버 측에서 CORS를 활성화해야합니다. 서버에 대한 제어 권한이있는 경우입니다. 여기 당신은 코드 나 웹 서버 자체에서 이러한 헤더를 추가 할 경우 같은 서버에 대한 몇 가지 세부 사항을 공유 할 수 있습니다 CORS

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET,POST,PUT,DELETE 
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept 

수 있도록 서버에서 리턴 된 헤더이다.

POST 요청에서 헤더를 설정하는 것이 효과가없는 이유에 대한 질문과 관련하여. 브라우저는 XHTTP 요청 전에 OPTION 요청을 발행하여 CORS 승인에 대한 서버의 허가를 요청합니다.

따라서 서버를 제어 할 수 있다면 이전에 언급 한 헤더를 추가 할 수 있습니다. 그렇지 않은 경우 일부 브라우저 플러그인을 사용하여이 체크를 극복 할 수 있습니다. 여기

는 개발자 도구의 네트워크 탭 CORS가 서버에서 구성해야

enter image description here

+0

한가지, 비록이 서버에 컬 요청을하면 예상 응답을 얻지 만 'Content-Type'헤더를 설정하지 않고도 그 헤더를 설정할 수 있습니다. POSTMAN과 원하는 응답을 얻으십시오. 노드 애플리케이션은 PhusionPassenger가있는 NGINX 인스턴스 뒤에 있기 때문에 거기에 추가 할 수 있습니다. 이상한 점은 앞서 언급 한 기법을 사용하여이 요청을 사용할 수 있지만 Angular와 함께 사용할 수는 없다는 것입니다. – MindVox

+0

"브라우저"가 프리 플라이트를하고 있기 때문에 각도가 작동하지 않습니다. curl 또는 postman에서 POST 요청은 다른 요청과 마찬가지로 서버로 직접 이동합니다. CORS 확인은 브라우저에 의해 부과됩니다. 그리고 네, 고정 헤더로 서버에 직접 추가 할 수 있습니다. 내 권장 사항은 더 나은 제어를 위해 코드에서 추가하는 것입니다. –

+0

보안상의 이유로 브라우저는 javascript 내에서 시작된 교차 출처 HTTP 요청을 제한합니다. 각도 브라우저에서 실행됩니다 :) – PierreDuc