Dies ist also die x-te Rache der Frage "Wie bringe ich Cookies von Drittanbietern dazu, in Safari zu funktionieren?", Aber ich frage erneut, weil ich denke, dass sich das Spielfeld geändert hat, möglicherweise nach Februar 2012. Einer der Standardtricks, um den 3. Platz zu erreichen Party-Cookies in Safari waren wie folgt: Verwenden Sie Javascript, um einen versteckten Iframe zu veröffentlichen. Es hat Safari (früher) dazu verleitet zu glauben, dass der Benutzer mit den Inhalten von Drittanbietern interagiert hat, und so das Setzen von Cookies ermöglicht.
Ich denke, diese Lücke wurde nach dem milden Skandal geschlossen, als sich herausstellte, dass Google diesen Trick mit seinen Anzeigen verwendet hat. Zumindest konnte ich mit diesem Trick keine Cookies in Safari setzen. Ich habe einige zufällige Internet-Postings entdeckt, in denen behauptet wurde, Apple arbeite daran, die Lücke zu schließen, aber ich habe kein offizielles Wort gefunden.
Als Fallback habe ich sogar versucht, den Hauptrahmen eines Drittanbieters so zu gestalten, dass Sie auf eine Schaltfläche klicken mussten, bevor der Inhalt geladen werden konnte, aber selbst diese direkte Interaktion reichte nicht aus, um Safaris kaltes, kaltes Herz zum Schmelzen zu bringen.
Weiß also jemand mit Sicherheit, ob Safari diese Lücke tatsächlich geschlossen hat? Wenn ja, gibt es andere Problemumgehungen (außer das manuelle Einfügen einer Sitzungs-ID in jede Anforderung)?
quelle
Antworten:
Ich wollte hier nur eine einfache funktionierende Lösung hinterlassen, die keine Benutzerinteraktion erfordert .
Wie ich in einem Beitrag sagte, machte ich :
Grundsätzlich müssen Sie Ihre Seite nur auf top.location laden, die Sitzung erstellen und sie zurück auf Facebook umleiten.
Fügen Sie diesen Code oben in Ihren Code ein
index.php
und setzen Sie ihn$page_url
auf die endgültige Registerkarte / App-URL Ihrer Anwendung. Sie werden sehen, dass Ihre Anwendung problemlos funktioniert.Hinweis: Dies wurde für Facebook erstellt, funktioniert jedoch in anderen ähnlichen Situationen.
Bearbeiten 20.12.2012 - Unterzeichnen der signierten Anfrage:
Der obige Code verwaltet die Post-Daten der Anforderungen nicht, und Sie würden die signierte_Anforderung verlieren, wenn Ihre Anwendung auf einer signierten Anforderung beruht. Probieren Sie den folgenden Code aus:
Hinweis: Dies wird noch ordnungsgemäß getestet und ist möglicherweise weniger stabil als die erste Version. Die Verwendung erfolgt auf eigenes Risiko / Feedback wird geschätzt.
(Vielen Dank an CBroe , der mich hier in die richtige Richtung gelenkt hat , um die Lösung zu verbessern.)
quelle
Sie sagten, Sie wären bereit, Ihre Benutzer auf eine Schaltfläche klicken zu lassen, bevor der Inhalt geladen wird. Meine Lösung bestand darin, mit einer Schaltfläche ein neues Browserfenster zu öffnen. In diesem Fenster wird ein Cookie für meine Domain gesetzt, der Öffner aktualisiert und dann geschlossen.
Ihr Hauptskript könnte also so aussehen:
Dann sieht safari_cookie_fix.php so aus:
quelle
Ich habe Safari mit einem .htaccess ausgetrickst:
Und es hat auch bei mir aufgehört zu arbeiten. Alle meine Apps verlieren die Sitzung in Safari und werden von Facebook weitergeleitet. Da ich es eilig habe, diese Apps zu reparieren, suche ich derzeit nach einer Lösung. Ich werde euch auf dem Laufenden halten.
Bearbeiten (06.04.2012): Anscheinend hat Apple es mit 5.1.4 "behoben". Ich bin sicher, dass dies die Reaktion auf die Google-Sache ist: "Bei der Durchsetzung der Cookie-Richtlinie ist ein Problem aufgetreten. Websites von Drittanbietern könnten Cookies setzen, wenn die Einstellung" Cookies blockieren "in Safari auf die Standardeinstellung" Cookies blockieren "gesetzt wurde." Von Dritten und Werbetreibenden ". Http://support.apple.com/kb/HT5190
quelle
In Ihrem Ruby on Rails-Controller können Sie Folgendes verwenden:
quelle
redirect_to params[:return_to]
. Dieser Parameter muss mit einer Whitelist sicherer Orte verglichen werden, an die umgeleitet werden kann. Siehe owasp.org/index.php/…Für meine spezielle Situation habe ich das Problem gelöst, indem ich window.postMessage () verwendet und jegliche Benutzerinteraktion eliminiert habe. Beachten Sie, dass dies nur funktioniert, wenn Sie js im übergeordneten Fenster ausführen können. Entweder indem Sie ein js aus Ihrer Domain einfügen oder wenn Sie direkten Zugriff auf die Quelle haben.
Im iframe (domain-b) überprüfe ich, ob ein Cookie vorhanden ist, und wenn es nicht gesetzt ist, wird eine postMessage an das übergeordnete Element (domain-a) gesendet. Z.B;
Warten Sie dann im übergeordneten Fenster (Domäne-a) auf das Ereignis.
Schließlich setzen Sie auf Ihrem Server (http://www.domain-b.com/safari/cookiefix) das Cookie und leiten es zurück zu dem Ort, von dem der Benutzer gekommen ist. Das folgende Beispiel verwendet ASP.NET MVC
quelle
"*"
umPostMessage
den Syntaxfehler zu behebenIch hatte das gleiche Problem und heute habe ich eine Lösung gefunden, die für mich gut funktioniert. Wenn der Benutzeragent enthält
Safari
und keine Cookies gesetzt sind, leite ich den Benutzer zum OAuth-Dialog um:Nach der Authentifizierung und dem Anfordern von Berechtigungen wird der OAuth-Dialog zu meiner URI an der obersten Position umgeleitet. Das Setzen von Cookies ist also möglich. Für alle unsere Canvas- und Page-Tab-Apps habe ich bereits das folgende Skript eingefügt:
Daher wird der Benutzer mit einem bereits gesetzten gültigen Cookie erneut auf die Registerkarte der Facebook-Seite weitergeleitet und die signierte Anfrage wird erneut veröffentlicht.
quelle
Ich habe mich schließlich für eine ähnliche Lösung entschieden wie Sascha, allerdings mit einigen Anpassungen, da ich die Cookies explizit in PHP setze:
Dadurch wird überprüft, ob das Cookie verfügbar ist, wenn der Browser Safari ist. Im nächsten Schritt befinden wir uns in der Anwendungsdomäne, nämlich der oben als URL_WHERE_APP_IS_LOCATED angegebenen URI.
Nach der Umleitung in die Anwendungsdomäne wird explizit ein Cookie gesetzt, und ich leite den Benutzer zum Autorisierungsprozess weiter.
In meinem Fall (da ich CakePHP verwende, es aber mit jedem anderen MVC-Framework problemlos funktionieren sollte) rufe ich die Anmeldeaktion erneut auf, wenn die FB-Autorisierung ein anderes Mal ausgeführt wird, und diesmal ist sie aufgrund des vorhandenen Cookies erfolgreich.
Nachdem ich die App einmal autorisiert hatte, hatte ich keine Probleme mehr mit der App mit Safari (5.1.6).
Hoffe das könnte jemandem helfen.
quelle
Ich hatte dieses Problem auf Geräten mit iOS. Ich habe mit einem Iframe einen Shop erstellt, der in eine normale Website eingebettet werden kann. Irgendwie erhielt der Benutzer bei jedem Seitenladen eine neue Sitzungs-ID, was dazu führte, dass Benutzer in der Mitte des Prozesses stecken blieben, weil einige Werte in der Sitzung nicht vorhanden waren.
Ich habe einige der auf dieser Seite angegebenen Lösungen ausprobiert, aber Popups funktionieren auf einem iPad nicht sehr gut und ich brauchte die transparenteste Lösung.
Ich habe es mit einer Umleitung gelöst. Die Website, auf der meine Website eingebettet ist, muss den Benutzer zuerst auf meine Website umleiten. Der obere Frame enthält also die URL zu meiner Website, auf der ich ein Cookie setze und den Benutzer auf die richtige Seite auf der Website umführe, auf der meine Website eingebettet ist, die übergeben wird durch in der URL.
Beispiel PHP-Code
Die Remote-Website leitet den Benutzer an weiter
init.php
Der Benutzer landet dort,
http://www.domain.com/shop/frame
wo meine Website eingebettet ist, speichert Sitzungen wie gewünscht und isst Cookies.Hoffe das hilft jemandem.
quelle
Lassen Sie mich meinen Fix in ASP.NET MVC 4 teilen. Die Hauptidee wie in der richtigen Antwort für PHP. Der nächste Code, der im Hauptlayout in der Kopfzeile neben den Skripten hinzugefügt wurde:
quelle
Diese Lösung gilt in einigen Fällen - wenn möglich:
Wenn die Iframe-Inhaltsseite eine Subdomain der Seite verwendet, die den Iframe enthält, wird das Cookie nicht mehr blockiert.
quelle
Google hat die Katze tatsächlich aus der Tasche gelassen. Sie benutzten es für eine Weile, um auf Tracking-Cookies zuzugreifen. Es wurde fast sofort von Apple = \ behoben
Originaler Beitrag im Wall Street Journal
quelle
Hier ist ein Code, den ich benutze. Ich habe festgestellt, dass Cookies von nun an auf magische Weise im Iframe funktionieren, wenn ich Cookies von meiner Website setze.
http://developsocialapps.com/foundations-of-a-facebook-app-framework/
quelle
Eine etwas einfachere Version in PHP von dem, was andere gepostet haben:
quelle
Ich habe die perfekte Antwort darauf gefunden, alles dank eines Mannes namens Allan, der hier alle Ehre verdient. ( http://www.allannienhuis.com/archives/2013/11/03/blocked-3rd-party-session-cookies-in-iframes/ )
Seine Lösung ist einfach und leicht zu verstehen.
Fügen Sie auf dem iframe-Inhaltsserver (Domäne 2) auf der Ebene der Stammdomäne eine Datei mit dem Namen Startsession.php hinzu, die Folgendes enthält:
Auf der Website der obersten Ebene, die den Iframe (Domäne1) enthält, sollte der Aufruf der Seite mit dem Iframe folgendermaßen aussehen:
Und das ist es! Simples :)
Der Grund dafür ist, dass Sie den Browser an eine URL eines Drittanbieters weiterleiten und ihn daher anweisen, ihm zu vertrauen, bevor Sie Inhalte aus ihm im iframe anzeigen.
quelle
Ich habe den modifizierten Whiteagle-Trick verwendet (dem Sign einen signierten_Anforderungsparameter hinzugefügt) und er hat für Safari funktioniert, aber der IE aktualisiert die Seite in diesem Fall ständig. Meine Lösung für Safari und Internet Explorer lautet also:
quelle
Ich habe auch unter diesem Problem gelitten, aber endlich die Lösung gefunden. Zunächst direkt das Laden der Iframe-URL in den Browser wie ein kleines Popup, dann nur auf die Sitzungswerte innerhalb des Iframes zugreifen.
quelle
Ich habe kürzlich das gleiche Problem bei Safari festgestellt. Die Lösung, die ich herausgefunden habe, basiert auf der HTML5-API für lokalen Speicher. Mit Local Storage können Sie Cookies emulieren.
Hier ist mein Blog-Beitrag mit Details: http://log.scalemotion.com/2012/10/how-to-trick-safari-and-set-3rd-party.html
quelle
Ich beschloss, die
$_SESSION
Variable alle zusammen loszuwerden und schrieb einen Wrapper um Memcache, um die Sitzung nachzuahmen.Überprüfen Sie https://github.com/manpreetssethi/utils/blob/master/Session_manager.php
Anwendungsfall: Sobald ein Benutzer in der App landet, speichern Sie die signierte Anforderung mit dem Session_manager. Da sie sich im Cache befindet, können Sie von nun an auf jeder Seite darauf zugreifen.
Hinweis: Dies funktioniert nicht, wenn Sie privat in Safari surfen, da die Sitzungs-ID jedes Mal zurückgesetzt wird, wenn die Seite neu geladen wird. (Dumme Safari)
quelle
Sie können dieses Problem beheben, indem Sie den Header als p3p-Richtlinie hinzufügen. Ich hatte das gleiche Problem auf Safari. Nachdem Sie den Header über den Dateien hinzugefügt haben, ist mein Problem behoben.
quelle