web-dev-qa-db-fra.com

Facebook et clarification de la messagerie interdomaine?

Je voulais étudier comment les identifiants de connexion facebook transfèrent les données vers la page principale (mypage), malgré la limitation des limites entre domaines.

Et donc j'ai créé une nouvelle page avec le code FB js sdk:

FB.login(function (response)
    {
    if (response.authResponse)
        {...

Cela ouvre le popup:

enter image description here

Mais quand j'ai enquêté pour voir si j'ai des iframes sur ma page (mon code ne contient pas d'iframes):

J'ai vu ça :

>>$("iframe")

résultat :

[
<iframe name=​"fb_xdm_frame_http" frameborder=​"0" allowtransparency=​"true" scrolling=​"no" id=​"fb_xdm_frame_http" aria-hidden=​"true" title=​"Facebook Cross Domain Communication Frame" tab-index=​"-1" src=​"http:​/​/​static.ak.facebook.com/​connect/​xd_arbiter.php?version=24#channe…l_path=%2FWebSite2%2FHTMLPage3.htm%3Ffb_xd_fragment%23xd_sig%3Df5252874%26" style=​"border:​ none;​">​…​</iframe>​
, 
<iframe name=​"fb_xdm_frame_https" frameborder=​"0" allowtransparency=​"true" scrolling=​"no" id=​"fb_xdm_frame_https" aria-hidden=​"true" title=​"Facebook Cross Domain Communication Frame" tab-index=​"-1" src=​"https:​/​/​s-static.ak.facebook.com/​connect/​xd_arbiter.php?version=24#cha…l_path=%2FWebSite2%2FHTMLPage3.htm%3Ffb_xd_fragment%23xd_sig%3Df5252874%26" style=​"border:​ none;​">​…​</iframe>​
]

J'ai lu qu'ils sont utilisés pour le domaine croisé.

Mais la question est de savoir pourquoi sont-ils sur ma page ?

Ils devraient être quelque part sur les pages internes de facebook!

Je le dis parce que je sais que la technique Iframe fonctionne comme ceci:

enter image description here

Comme vous pouvez le constater - l’Iframe interne crée un autre iframe avec la valeur SRC de la chaîne de requête (la valeur est l’URL de la page supérieure en fait), puis avec JS sur les deux pages + URL => JS fonctions de déclenchement, nous pouvons faire :

top.sendData({...})

Qu'est-ce que je rate ?

  • Comment les données sont-elles transmises du login FB à ma page?
17
Royi Namir

Je suis l'ingénieur qui a conçu l'infrastructure actuelle pour la messagerie inter-domaines dans le kit de développement logiciel de Facebook JS, de sorte que je peux peut-être vous éclairer ici.

Cette configuration peut sembler peu orthodoxe et déroutante pour certains, mais elle est vraiment très élégante, si je puis me permettre moi-même :)


Selon la nature de la page, HTTP ou HTTPS, le kit de développement logiciel (SDK) JS créera deux iframes, pointant vers la ressource xd_arbiter.php, servie à partir d'un domaine * .facebook.com. Puisqu'ils définissent document.domain = 'facebook.com', ceux-ci peuvent communiquer avec d'autres ressources sur facebook.com qui font la même chose.

Ces ressources, les mandataires, obtiennent des informations à travers le fragment, afin de leur donner des capacités dynamiques, mais sont sinon 100% statiques et mises en cache par votre navigateur. Elles sont donc très rapides à charger.

Ce qui se passe ensuite, c’est qu’un lien de messagerie inter-domaines est établi entre la page Hôte et chacun des iframes (les proxies). Cela signifie qu'à partir de maintenant, la page hôte peut communiquer avec une page HTTPS sur facebook.com. Si la page hôte est HTTP, elle peut également communiquer avec une page HTTP sur facebook.com.

La façon dont ce lien fonctionne entre les navigateurs est un sujet plus complexe, mais tout est résumé dans un canal, comme vous pouvez le voir avec easyXDM .


Maintenant, chaque fois que le SDK JS crée une nouvelle fenêtre sur facebook.com, soit sous forme de fenêtre contextuelle, soit sous forme d'iframe, au lieu d'avoir à configurer un nouveau canal de communication entre la page Hôte et chaque fenêtre, les nouvelles fenêtres peuvent utiliser les fonctions existantes. proxy, sans frais de configuration.

Lorsqu’ils doivent envoyer des messages à la page hôte, ceux-ci utiliseront (window.opener || window.parent).frames['fb_xdm_frame_' + location.protocol.replace(':', '') pour obtenir un descripteur du proxy. De la même manière, le proxy peut utiliser parent.frames[some_name] pour obtenir un descripteur des iframes frères de la page, à condition que le proxy correct (HTTP ou HTTPS) a été utilisé.

Pour nous, cela signifie essentiellement que le problème de la communication entre domaines est isolé du JS SDK et de ses ressources - tous les services que nous développons sur cette base peuvent s'appuyer sur une très simple API de send_this_message(message, Origin) et se termineront comme par magie. à l’autre bout, si les contrôles Origin nous le permettent.

J'espère que cela répond à votre question!


(xd_arbiter.php peut également servir de cible de redirection, où il utilisera ses mandataires frères pour relayer le message).

33
Sean Kinsey

Je pense que le concept peut être simple si vous êtes ie8 + dans votre code.

CORS peut être utilisé pour communiquer entre domaines. Assurez-vous que les bons en-têtes sont définis chez votre hôte et que tout va bien.

Ou, créez un iframe, définissez sa src comme élément transmettant des informations à un script dynamique. Traiter l'information. Renvoyez le code JS à l'iframe qui utilise postMessage pour communiquer avec la fenêtre extérieure.

0
majestiq