php session & iframe

8

Ich habe hier ein paar verwandte Beiträge gelesen, aber ich kann nicht scheinen, dass mein Skript so funktioniert wie beabsichtigt.

Ich habe eine Login-Seite, auf der sich ein Benutzer anmeldet. Wenn das Passwort übereinstimmt, schreibt das Skript zwei Werte in die Variable $_SESSION : ['loggedin']='yes' und ['loginname']="username" .

Nach erfolgreicher Anmeldung geht der Benutzer zu einer anderen Seite mit zwei iframes.

Ein iframe verwendet externen Inhalt und erfordert keine Authentifizierung (das Entfernen dieses iframes von der Seite ändert nichts).

Der andere iFrame verwendet dynamisch generierten Inhalt aus derselben Domäne und überprüft, ob die Sitzungsvariablen noch vorhanden sind.

Eine der Funktionen aktualisiert den Inhalt dieses dynamisch generierten iframes.

Sobald dies erledigt ist, sind die Sitzungsvariablen verloren. Tatsächlich existiert die Sitzung selbst nicht mehr.

Ich habe session_start(); auf jeder Seite, die in Verbindung mit diesem Skript verwendet wird.

Jede Hilfe wird sehr geschätzt.

    
Uno Mein Ame 21.01.2012, 23:50
quelle

2 Antworten

16

Ich glaube, dieser Artikel wird nützlich sein: Ссылка

Die kurze Antwort lautet: Starten Sie im Iframe die Sitzung wie folgt:

%Vor%

BEARBEITEN:

Ich dachte, ich sollte diese Antwort aktualisieren, da ich auf etwas gestoßen bin, über das jeder wissen sollte.

Dieser p3p-Header-Hack funktioniert auf Safari nicht .

Im Folgenden beschreibe ich meinen Login-Ablauf und wie ich dieses Problem gelöst habe.

Mein Login-Flow sieht so aus (Seiten-App):

  • überprüft, ob der aktuelle Benutzer eine Sitzung hat,
  • falls nicht, Weiterleitung an die Login-URL (generiert vom PHP SDK),
  • Der Login-Dialog leitet zurück zu einer URL, wo ich den 'code' GET-Parameter benutze, den facebook mir gibt, um ein Access-Token zu bekommen, das ich zur späteren Verwendung speichern kann. (Speichern in der DB und für die Sitzung.) Wenn ich damit fertig bin, leite ich den Benutzer zu meiner Seiten-App um, wo alles funktioniert.
  • Jeder sollte an dieser Stelle glücklich sein.

ABER Hier kommt der Fehler.

Wenn ein Benutzer Safari verwendet und versucht, diese App zu öffnen, wenn die Sitzungen bereits zerstört wurden (ein paar Tage später), passiert Folgendes:

  • Der Code prüft auf eine Sitzung: Er findet die Benutzer-ID (Methode PHP SDK getUser ()), also suche ich zuerst nach einem Eintrag in der Datenbank.
  • Da der Benutzer sich vorher angemeldet hat, hat er einen Eintrag in der Datenbank, also greife ich ihn einfach und speichere ihn in einer Sitzung, damit zukünftige AJAX-Anrufe alle benötigten Informationen haben.

Wichtig ist hier, dass dieser Code in einer Seitenregisterkarte innerhalb eines iframes ausgeführt wird.

Also wird der Code für die meisten Benutzer funktionieren, wegen des p3p header hacks.

Aber für Safari-Benutzer wird es nicht.

Safari kümmert sich nicht um die angegebene Kopfzeile, es verweigert das Speichern der Sitzung, daher meldet sich der Benutzer bei der App an, alles scheint gut zu funktionieren, aber die Ajax-Aufrufe funktionieren nicht, da sie nicht funktionieren jede Sitzung mit zu arbeiten.

Die Problemumgehung:

Ganz einfach eigentlich - Obwohl nicht zu elegant, aber hey, es funktioniert. -: Ich überprüfe, ob der Client-Browser Safari ist oder nicht, und wenn ja, leite ich auf eine benutzerdefinierte URL um, wo ich eine Sitzung - außerhalb des Facebook-Iframes - starte, um dann zurück zur App zu leiten.

Dadurch wird der Cookie ohne Probleme erstellt, sodass Sitzungen verfügbar sind.

Hier haben Sie einen Code:

Ich hoffe, dass dieser zusätzliche Trick jemandem helfen wird.

EDIT2

Ich habe das bisher noch nicht getestet, aber anstatt den P3P-Header hinzuzufügen, könnten Sie einfach die folgenden Zeilen zu Ihrem .htaccess hinzufügen:

%Vor%

Mit Kommentaren:

%Vor%

Alles Lob gebührt diesem .htacces-Code für die Leute hinter dem Yeoman -Projekt.

    
ZeeCoder 24.07.2012 21:10
quelle
4

Fügen Sie zu jeder Ihrer Seiten in den Frames Folgendes hinzu:

echo "Session ID: ".session_id();

Dies sollte die Sitzungs-ID auf jeder Seite ausgeben. Es ist möglich, dass eine neue Sitzung auf einem der Frames generiert wird. Wenn Sie das oben genannte überprüfen, können Sie diese Möglichkeit ausschließen.

    
Leo Haris 21.01.2012 23:58
quelle

Tags und Links