2011-01-15 1 views
58

저는 캔버스 응용 프로그램에 관한 Facebook의 설명서 읽기를 탐색 중이며 예제 응용 프로그램은 http://developers.facebook.com/docs/samples/canvas입니다. 그러나 예제를 통해 읽은 것처럼 iframe 애플리케이션에서 쿠키를 사용하는 것에 대해 매우 혼란스러워했습니다.Facebook은 캔버스 페이지에서 iFrame에 대한 도메인 간 쿠키를 어떻게 설정합니까?

약간의 뒷이야기 ...

이미 (페이스 북과 관련이없는) 임베드 위젯 iframe을 사용하여 주위를 연주했고 나는 몇 브라우저 (크롬, 사파리 등) 엄격한 쿠키 정책을 발견하고 iframe에 설정된 교차 도메인 쿠키를 허용하지 않습니다 (반면에 Firefox는 iframe에서 iframe의 교차 도메인 쿠키를 설정할 수 있음). 예를 들어 foo.com에 src="http://bar.com/widget"의 iframe이있는 경우 iframe 위젯은 bar.com에 대한 쿠키를 설정할 수 없으므로 iframe 내에서 상태를 유지하는 데 문제가 있습니다. bar.com은 모든 요청 (ajax 요청 포함)을 해석합니다. 설정된 세션없이 새로운 요청으로 위젯에서. 고투하고 JSONP와 javascript를 사용하여 foo.com의 쿠키를 설정하여이 문제를 해결했습니다 ...

... 그래서?

글쎄, 나는 예제 캔버스 iframe Facebook 응용 프로그램을보고 있었고, (runwithfriends.appspot.com에서 호스팅되는) 자신의 응용 프로그램이 다른 사용자와 함께 현재 사용자의 ID가있는 u 쿠키를 설정할 수 있다고 나타났습니다. runwithfriends.appspot.com 도메인의 매개 변수 그것은 모든 요청과 함께이 쿠키를 보냅니다 ... 그리고 그것은 크롬과 파이어 폭스 모두에서 작동합니다! WTF? Facebook에서 Chrome의 교차 도메인 쿠키 제한을 어떻게 극복합니까?

(나는 이미 지금은 답을 알고,하지만 난이 사람이 같은 일을 알아 내기 위해 애 쓰고 도움이 될 거라고 생각 -. 나는 아래의 답변을 게시합니다)

+0

업데이트 : 일부 브라우저의 최신 버전 (OS X에서는 Safari v6.x +, iOS 6+에서는 Safari, 그리고 Chrome 및 FF가 곧) 교차 도메인 쿠키 설정을 더 이상 post-to-iframe 요청에도 허용하지 않습니다. –

답변

59

그래서 iframe이 실제로 아니다 runwithfriends.appspot.com 도메인에 대해 u 쿠키를 설정합니다. Facebook은 폼 (<form action="runwithfriends.appspot.com/..." target="name_of_iframe" method="POST">)을 만들고 자바 스크립트를 사용하여 페이지로드시 양식을 제출합니다. 폼의 대상은 iframe이므로 페이지를 다시로드하지 않고 POST의 응답으로 iframe을로드합니다. 분명히 엄격한 쿠키 정책을 사용하는 Chrome 및 다른 브라우저에서도 POST 요청 인 경우 도메인 간 요청에 대한 쿠키를 설정합니다 ...

+2

어떻게 작동하는지 증명할 수있는 sinatra 앱을 만들었습니다. https://github.com/agibralter/iframe-widget-test –

+0

안녕하세요, Aaron,이 코드/데모 버전의 순수한 자바 버전입니까? – lshettyl

+2

@LShetty - 죄송합니다, 내가 무슨 뜻인지 이해할 수 없습니까? 순수한 자바 스크립트입니까? 데모의 Ruby 부분은 웹 서버 역할을합니다 ... Node.js로 작성된 데모를보고 싶습니까? –