2013-04-20 3 views
2

AJAX를 통해 RoR 웹 응용 프로그램과 상호 작용해야하는 약간의 위젯 (JavaScript 사용)을 구축 중입니다. 사용자의 워크 플로는 다음과 같습니다AJAX 요청 - 쿠키 인증

  1. 로그인 RoR에 웹 응용 프로그램에
  2. 가져 브라우저 확장 또는 북마크 (모두 같은 코드베이스 공유), 웹 사이트에 중
  3. 이동하고 위젯을 활성화
  4. 당신이 원하는 웹 사이트
  5. 포인트 물건은 OK를 눌러 저장하세요
  6. 당신 캡처 한 내용

와 웹 응용 프로그램의 URL을 다시 얻을 위젯 코드의 흐름은 같은 보이는 다음 DOM에서

  1. 수집 물건을하고 '승인되지 않은이'과 <iframe />을 열고 읽기 응답에서 사용자 정의 상태 메시지가 있다면 관련 jQuery를 JSONP 요청을
  2. 를 발행 웹 응용 프로그램에서 발생하는 인증 페이지 - 인증 응답에 성공하면 이후 AJAX에 필요한 인증 쿠키를 설정 Set-Cookie 헤더가 년대 JSONP 요청을 시도, 인증이 필요가있었습니다 경우
  3. 을 requets 다시

북마크릿에서 작동합니다. 그러나 Firefox 확장 프로그램의 경우 웹 응용 프로그램은 인증 쿠키를 제거한 요청을받습니다. 사실 모든 쿠키를 박탈당했습니다. 요청이 샌드 박스 처리 된 것처럼 보입니다. 확장 프로그램에 @mozilla.org/cookieService을 사용할 수 있음을 확인했습니다. 질문은 다음과 같습니다.

  1. 콘텐츠 스크립트의 JSONP 요청에 확장 프로그램의 main.js에서 쿠키를 전달하는 방법은 무엇입니까?
  2. urv localhost : 3000을 사용하여 개발 env에 대한 쿠키를 얻는 방법은 무엇입니까? cookieService은 해당 URL의 쿠키로 null을 반환합니다.
  3. 쿠키가 다른 것으로 변경되는 방식을 변경하는 것이 가능합니까?

답변

0

요청은 실제로 샌드 박스가 아니지만 원본 문서가 없습니다. 네트워크 코드는 요청이 첫 번째 파티 또는 타사 요청인지 여부를 알지 못하므로 기본적으로 후자로 처리합니다. 오래 전에 파이어 폭스가 제 3 자 서버에 쿠키를 보낼 수 없게 되었기 때문에 귀하의 요청에 쿠키가없는 것입니다. XUL에서

/XPCOM 애드온 (쉬운 방법)을 할 거라고 :

var req = <construct xmlhttprequest>; 
... 
req.open(...); 
if (req.channel instanceof Components.interfaces.nsIHttpChannelInternal) { 
    req.channel.forceAllowThirdPartyCookie = true; 
} 

을 부가 SDK 사용자 다음을 수행 할 수 있습니다 것 net/xhr를 사용하는 경우 :

const { XMLHttpRequest, forceAllowThirdPartyCookie } = require("sdk/net/xhr"); 
var req = new XMLHttpRequest(); 
... 
req.open(...); 
forceAllowThirdPartyCookie(req); 

상위 레벨 request 모듈은 항상 forceAllowThirdPartyCookie을 자동으로 호출합니다.다시 질문 이제

:

  1. JSONP를 사용하지 마십시오. 이는 (다소) 안전한 컨텍스트에서 원격의 신뢰할 수없는 코드를 기본적으로 사용하는 것과 동일합니다. 중간자 공격자가 있는지 (보안되지 않은 연결을 사용하는 경우) 또는 서버가 손상되었는지 (모든 연결) 알 수 없습니다.

    어쨌든 content-scripts는 위의 방법을 사용할 수 없으므로 권한있는 코드 (예 : main.js)에서 요청을 수행하고 메시지 전달을 사용하여 콘텐츠 스크립트로 응답을 전달해야합니다.

  2. 실제로는 nsICookieService*을 직접 사용하면 안됩니다. 서비스를 실제로 사용하려면 docs을 읽으십시오.
  3. 언제든지 다른 인증 방법으로 전환 할 수 있습니다. 사용할 수있는 방법과 방법은 요구 사항에 따라 달라집니다 (답변이 너무 광범위 함).