code

HTTP 헤더의 Set-Cookie는 AngularJS에서 무시됩니다.

codestyles 2020. 11. 12. 08:14
반응형

HTTP 헤더의 Set-Cookie는 AngularJS에서 무시됩니다.


저는 클라이언트 측의 AngularJS와 서버 측의 API 용 Java (Tomcat + Jersey for WS)를 기반으로 한 애플리케이션을 작업 중입니다.

내 API의 일부 경로는 제한되어 있습니다. 사용자에게 세션이없는 경우 반환되는 응답 상태는 401입니다. 클라이언트 측에서는 401 http 상태를 가로 채서 사용자를 로그인 페이지로 리디렉션합니다.

사용자가 인증되면 서버 측에서 세션을 생성합니다.

httpRequest.getSession (true);
클라이언트에 보내는 응답에는 헤더에 Set-cookie 명령이 있습니다.

Set-Cookie : JSESSIONID = XXXXXXXXXXXXXXXXXXXXX; 도메인 = localhost; 경로 = / api /; HttpOnly

문제는 쿠키가 클라이언트 측에 절대 저장되지 않는다는 것입니다. localhost 도메인에 대한 쿠키를 검사 할 때 비어 있으므로 다음 요청의 헤더에이 쿠키가없고 클라이언트 측에서 여전히 내 API의 제한된 경로에 액세스 할 수 없습니다.

클라이언트와 서버는 동일한 도메인에 있지만 경로와 포트 번호가 동일하지 않습니다.

고객 : http://localhost:8000/app/index.html

서버 : http://localhost:8080/api/restricted/

추가 정보 : CORS는 양쪽에서 활성화됩니다.

"Access-Control-Allow-Methods", "GET, POST, OPTIONS"
"액세스 제어-허용-원본", "*"
"Access-Control-Allow-Credentials", true

Set-cookie가 제대로 작동하도록 만드는 아이디어가 있습니까? AngularJS 관련 문제입니까?


AngularJS에서 앞으로 나아가는 데 도움이 되는 문제를 발견했습니다 .

"Access-Control-Allow-Credentials" : true클라이언트 측에서 설정되지 않은 것 같습니다 . 지시 $httpProvider.defaults.withCredentials = true가 무시되었습니다.

$ resource 호출을 구성 매개 변수에서 {withCredentials : true}로 간단한 $ http 호출로 대체합니다.


나는 당신과 매우 유사한 문제를 해결했습니다. 내 플레이! 백엔드가 Angular에서 잡거나 브라우저를 통해 저장할 수없는 세션 쿠키를 설정하려고했습니다.

실제로 해결책은 이것과 약간을 포함했습니다.

Access-Control-Allow-Origin에 특정 도메인을 추가하고 와일드 카드를 제거해야만 해결할 수있는 초기 문제를 해결했다고 가정하면 다음 단계는 다음과 같습니다.

  1. Set-Cookie헤더 에서 HTTP 전용을 제거해야합니다 . 그렇지 않으면 각도 코드에 의해 "생성 된"쿠키를받을 수 없습니다.
    이 설정은 Firefox에서 이미 작동하지만 Chrome에서는 작동하지 않습니다.

  2. Chrome에서도 작동하려면 다음을 수행해야합니다.

    a) WS가 "호스팅되는"도메인을 사용하여 쿠키의 localhost에서 다른 도메인을 보냅니다. .domain.com대신 다음 과 같은 와일드 카드를 사용할 수도 있습니다.ws.domain.com

    b) 그런 다음 쿠키에 지정한 도메인을 호출해야합니다. 그렇지 않으면 Chrome이 쿠키를 저장하지 않습니다.

    [선택] 난 그 제거 할 /api에 찬성 경로를/


그리고 그것은 트릭이어야합니다.
도움이 되었기를 바랍니다.


클라이언트 측의 게시 요청에서 다음을 추가해야합니다.

jquery ajax 요청의 경우 :

$.ajax({
  url: "http://yoururlgoeshere",
  type: "post",
  data: "somedata",
  xhrFields: {
    withCredentials: true
  }
});

Angular의 $ http 서비스 :

$http.post("http://yoururlgoeshere", "somedata", {
  withCredentials: true
});


서버와 클라이언트 모두에서 작업해야합니다.

고객

다음 방법 중 하나로 $httpconfig withCredentialstrue설정하십시오 .

  1. 요청 당

    var config = {withCredentials: true};
    $http.post(url, config);
    
  2. 모든 요청에 ​​대해

    angular.module("your_module_name").config(['$httpProvider',
      function($httpProvider) {
        $httpProvider.interceptors.push(['$q',
          function($q) {
            return {
              request: function(config) {
                config.withCredentials = true;
                return config;
              }
            };
          }
        ]);
      }
    ]);
    

섬기는 사람

Set the response header Access-Control-Allow-Credentials to true.


The addition HttpOnly means that the browser should not let plugins and JavaScript see the cookie. This is a recent convention for securer browsing. Should be used for J_SESSIONID but maybe not here.


Just solved a problem like this.

I was doing this and not working...:

  $cookies.put('JSESSIONID', response.data);

Cookies are saved in the browser, but when I sent a new request, all the cookies were sent exept mine. (my cookie is JSESSIONID)

then i look in the chrome inspector and i found this: My session are the JsessionID

THE PROBLEM IS THAT WAS NOT THE CORRECT PATH!!!

then I tried this and my cookies were sent. yay! :

$cookies.put('JSESSIONID', response.data, {'path':'/'});

I do not know if this is your case, but this worked for me.

regards!

참고URL : https://stackoverflow.com/questions/15026016/set-cookie-in-http-header-is-ignored-with-angularjs

반응형