C'est donc la énième revanche de la question «comment faire fonctionner les cookies tiers dans Safari», mais je la pose à nouveau car je pense que les règles du jeu ont changé, peut-être après février 2012. L'une des astuces standard pour obtenir la 3e les cookies de fête dans Safari étaient les suivants: utilisez du javascript pour POST dans un iframe caché. Il (utilisé pour) tromper Safari en lui faisant croire que l'utilisateur avait interagi avec le contenu tiers et ainsi autoriser l'installation de cookies.
Je pense que cette faille a été comblée à la suite du léger scandale où il a été révélé que Google utilisait cette astuce avec ses publicités. À tout le moins, en utilisant cette astuce, j'ai été complètement incapable de définir des cookies dans Safari. J'ai déniché des publications aléatoires sur Internet affirmant qu'Apple travaillait à combler cette faille, mais je n'ai trouvé aucun mot officiel.
En guise de solution de secours, j'ai même essayé de redessiner le cadre principal tiers afin que vous deviez cliquer sur un bouton avant que le contenu ne se charge, mais même ce niveau d'interaction directe n'était pas suffisant pour faire fondre le cœur froid et froid de Safari.
Alors, est-ce que quelqu'un sait avec certitude si Safari a effectivement fermé cette faille? Si tel est le cas, existe-t-il d'autres solutions de contournement (autres que l'inclusion manuelle d'un ID de session dans chaque demande)?
la source
Réponses:
Je voulais juste laisser une solution de travail simple ici qui ne nécessite pas d'interaction de l'utilisateur .
Comme je l'ai déclaré dans un article que j'ai publié :
En gros, tout ce que vous avez à faire est de charger votre page sur top.location, de créer la session et de la rediriger vers Facebook.
Ajoutez ce code en haut de votre
index.php
et définissez-le$page_url
sur l'onglet final / URL de l'application et vous verrez que votre application fonctionnera sans aucun problème.Remarque: cela a été fait pour Facebook, mais cela fonctionnerait dans toutes les autres situations similaires.
Edit 20-Dec-2012 - Maintenir la demande signée:
Le code ci-dessus ne gère pas les données de publication des demandes, et vous perdriez la signature_request, si votre application repose sur une demande signée, n'hésitez pas à essayer le code suivant:
Remarque: Ceci est toujours en cours de test correctement et peut être moins stable que la première version. Utilisez à vos risques et périls / Les commentaires sont appréciés.
(Merci à CBroe de m'avoir orienté dans la bonne direction permettant ici d'améliorer la solution)
la source
Vous avez dit que vous étiez prêt à ce que vos utilisateurs cliquent sur un bouton avant le chargement du contenu. Ma solution était d'avoir un bouton pour ouvrir une nouvelle fenêtre de navigateur. Cette fenêtre définit un cookie pour mon domaine, actualise l'ouvre-porte puis se ferme.
Ainsi, votre script principal pourrait ressembler à:
Alors safari_cookie_fix.php ressemble à:
la source
J'ai trompé Safari avec un .htaccess:
Et ça a cessé de fonctionner pour moi aussi. Toutes mes applications perdent la session dans Safari et redirigent hors de Facebook. Comme je suis pressé de réparer ces applications, je recherche actuellement une solution. Je te tiendrai au courant.
Edit (2012-04-06): Apparemment, Apple l'a "corrigé" avec 5.1.4. Je suis sûr que c'est la réaction à la chose Google: "Un problème existait dans l'application de sa politique en matière de cookies. Les sites Web tiers pouvaient définir des cookies si la préférence" Bloquer les cookies "dans Safari était définie sur le paramètre par défaut" De tiers et d'annonceurs ". Http://support.apple.com/kb/HT5190
la source
Dans votre contrôleur Ruby on Rails, vous pouvez utiliser:
la source
redirect_to params[:return_to]
. Ce paramètre doit être vérifié par rapport à une liste blanche d'endroits sûrs vers lesquels rediriger. Voir owasp.org/index.php/…Pour ma situation spécifique, j'ai résolu le problème en utilisant window.postMessage () et en éliminant toute interaction de l'utilisateur. Notez que cela ne fonctionnera que si vous pouvez d'une manière ou d'une autre exécuter js dans la fenêtre parente. Soit en lui faisant inclure un js de votre domaine, soit si vous avez un accès direct à la source.
Dans l'iframe (domaine-b), je vérifie la présence d'un cookie et s'il n'est pas défini, j'enverrai un message postal au parent (domaine-a). Par exemple;
Ensuite, dans la fenêtre parent (domaine-a), écoutez l'événement.
Enfin, sur votre serveur (http://www.domain-b.com/safari/cookiefix), vous définissez le cookie et redirigez vers l'endroit d'où l'utilisateur vient. L'exemple ci-dessous utilise ASP.NET MVC
la source
"*"
pourPostMessage
corriger l'erreur de syntaxeJ'ai eu le même problème et aujourd'hui j'ai trouvé un correctif qui fonctionne bien pour moi. Si l'agent utilisateur contient
Safari
et qu'aucun cookie n'est défini, je redirige l'utilisateur vers la boîte de dialogue OAuth:Après l'authentification et la demande d'autorisations, la boîte de dialogue OAuth redirigera vers mon URI à l'emplacement supérieur. Il est donc possible de configurer des cookies. Pour toutes nos applications de canevas et d'onglets de page, j'ai déjà inclus le script suivant:
Ainsi, l'utilisateur sera redirigé vers l'onglet de la page Facebook avec un cookie valide déjà défini et la demande signée est à nouveau publiée.
la source
J'ai finalement opté pour une solution similaire à celle fournie par Sascha, mais avec quelques ajustements, car je configure les cookies explicitement en PHP:
Cela vérifie si le cookie est disponible lorsque le navigateur est en safari. Dans l'étape suivante, nous sommes sur le domaine de l'application, à savoir l'URI fourni comme URL_WHERE_APP_IS_LOCATED ci-dessus.
Ainsi, après avoir été redirigé vers le domaine d'application, un cookie est défini explicitement et je redirige l'utilisateur vers le processus d'autorisation.
Dans mon cas (puisque j'utilise CakePHP mais cela devrait fonctionner correctement avec n'importe quel autre framework MVC), j'appelle à nouveau l'action de connexion où l'autorisation FB est exécutée une autre fois, et cette fois, elle réussit grâce au cookie existant.
Après avoir autorisé l'application une fois, je n'ai plus eu de problèmes d'utilisation de l'application avec Safari (5.1.6)
J'espère que cela pourrait aider n'importe qui.
la source
J'ai eu ce problème sur les appareils exécutant iOS. J'ai créé une boutique intégrable dans un site Web normal à l'aide d'une iframe. D'une manière ou d'une autre, à chaque chargement de page, l'utilisateur a un nouvel identifiant de session, ce qui fait que les utilisateurs sont bloqués à mi-chemin du processus parce que certaines valeurs n'étaient pas présentes dans la session.
J'ai essayé certaines des solutions proposées sur cette page, mais les popups ne fonctionnent pas très bien sur un iPad et j'avais besoin de la solution la plus transparente.
Je l'ai résolu en utilisant une redirection. Le site Web qui intègre mon site doit d'abord rediriger l'utilisateur vers mon site, de sorte que le cadre supérieur contient l'url de mon site, où je place un cookie et redirige l'utilisateur vers la page appropriée sur le site Web qui intègre mon site, qui est passé via l'url.
Exemple de code PHP
Le site Web distant redirige l'utilisateur vers
init.php
L'utilisateur se retrouve
http://www.domain.com/shop/frame
là où mon site est intégré, stockant les sessions comme il se doit et mangeant des cookies.J'espère que cela aide quelqu'un.
la source
Permettez-moi de partager mon correctif dans ASP.NET MVC 4. L'idée principale comme dans la bonne réponse pour PHP. Le code suivant ajouté dans la mise en page principale dans l'en-tête près de la section des scripts:
la source
Cette solution s'applique dans certains cas - si possible:
Si la page de contenu iframe utilise un sous-domaine de la page contenant l'iframe, le cookie n'est plus bloqué.
la source
Google a en fait laissé le chat sortir du sac sur celui-ci. Ils l'utilisaient depuis un certain temps pour accéder aux cookies de suivi. Il a été corrigé presque immédiatement par Apple = \
article original du Wall Street Journal
la source
Voici un code que j'utilise. J'ai constaté que si je place un cookie sur mon site, les cookies fonctionnent comme par magie dans l'iframe à partir de là.
http://developsocialapps.com/foundations-of-a-facebook-app-framework/
la source
Une version légèrement plus simple en PHP de ce que d'autres ont publié:
la source
J'ai trouvé la réponse parfaite à cela, tout cela grâce à un gars appelé Allan qui mérite tout le crédit ici. ( http://www.allannienhuis.com/archives/2013/11/03/blocked-3rd-party-session-cookies-in-iframes/ )
Sa solution est simple et facile à comprendre.
Sur le serveur de contenu iframe (domaine 2), ajoutez un fichier appelé startsession.php au niveau du domaine racine qui contient:
Maintenant, sur le site Web de niveau supérieur contenant l'iframe (domaine1), l'appel à la page contenant l'iframe devrait ressembler à:
Et c'est tout! Simples :)
La raison pour laquelle cela fonctionne est que vous dirigez le navigateur vers une URL tierce et lui dites ainsi de lui faire confiance avant d'afficher le contenu de celle-ci dans l'iframe.
la source
J'ai utilisé l'astuce de Whiteagle modifiée (ajout du paramètre signed_request au lien) et cela a fonctionné bien pour le safari, mais IE actualise constamment la page dans ce cas. Ma solution pour Safari et Internet Explorer est donc:
la source
J'ai également souffert de ce problème, mais j'ai finalement obtenu la solution.Initialement, chargez directement l'url iframe dans le navigateur comme une petite fenêtre contextuelle, puis accédez uniquement aux valeurs de session à l'intérieur de l'iframe.
la source
J'ai récemment rencontré le même problème sur Safari. La solution que j'ai trouvée est basée sur l'API HTML5 de stockage local. En utilisant le stockage local, vous pouvez émuler des cookies.
Voici mon article de blog avec des détails: http://log.scalemotion.com/2012/10/how-to-trick-safari-and-set-3rd-party.html
la source
J'ai décidé de me débarrasser de la
$_SESSION
variable ensemble et j'ai écrit un wrapper autour de Memcache pour imiter la session.Vérifier https://github.com/manpreetssethi/utils/blob/master/Session_manager.php
Cas d'utilisation: au moment où un utilisateur atterrit sur l'application, stockez la demande signée à l'aide de Session_manager et comme elle est dans le cache, vous pouvez y accéder sur n'importe quelle page désormais.
Remarque: cela ne fonctionnera pas lors de la navigation privée dans Safari car le session_id se réinitialise à chaque fois que la page se recharge. (Safari stupide)
la source
Vous pouvez résoudre ce problème en ajoutant l'en-tête en tant que politique p3p .. J'ai eu le même problème sur Safari donc après l'ajout d'un en-tête au-dessus des fichiers, mon problème a été résolu.
la source