it-swarm.com.de

Das CSRF-Status-Token stimmt nicht mit einem bereitgestellten FB überein PHP SDK 3.1.1 Oauth 2.0

Meine Serverprotokolle zeigen den Fehler "CSRF-Status-Token passt nicht zu einem bereitgestellten" Fehler, der bei fast jedem Benutzer auftritt. Die Benutzer werden jedoch erstellt und/oder authentifiziert, und ich kann die Benutzerinformationen abrufen. Ich verwende einen Linux-Server mit Apache. Ich verwende auch das neueste Facebook PHP SDK v.3.1.1. Kann mir jemand sagen, warum dies passiert und wie es behoben werden kann?

23
Harry Andrei

Ich hatte letzte Woche ein ähnliches Problem, und es wurde festgestellt, dass das Feld state von mehreren Aufrufen von getLoginUrl() überschrieben wurde. Bei jedem Aufruf von getLoginUrl() wird ein neues state-Token im SDK generiert und im $_SESSION gespeichert (es handelt sich lediglich um einen zufälligen Wert). Wenn Sie ihn also zweimal aufrufen und der Benutzer den ersten Link verwendet, um sich anzumelden, ist der zweite Aufruf erforderlich Setzen Sie das interne state-Token des SDK zurück, und Sie erhalten diesen Fehler in Ihren Protokollen.

Das SDK sucht nach dem gleichen state-Token in der zurückkommenden URL, nachdem Facebook den Benutzer autorisiert hat, und leitet ihn zurück auf Ihre Website. Wenn dies nicht der Fall ist, wird dieser Fehler protokolliert (hier ein Link zur source ) .

35
jches

Der Facebook-SDK-Code weist einen Fehler auf, wenn im gleichen Handler zweimal gegen Token gesucht wird. 

Ich habe die getCode-Funktion von facebook.php folgendermaßen bearbeitet: 

protected function getCode() {
    if (!isset($_REQUEST['code']) || !isset($_REQUEST['state']) || $this->state === null) {
      return false;
    }
    if ($this->state === $_REQUEST['state']) {
        // CSRF state has done its job, so clear it
        $this->state = null;
        $this->clearPersistentData('state');
        return $_REQUEST['code'];
    }
    self::errorLog('CSRF state token does not match one provided.');

    return false;
}

um klarer zu sein und gibt ungültiges Token nicht an, wenn es zweimal aufgerufen wird.

Um klar zu sein, kann die Funktion zweimal mit demselben URL-Handler aufgerufen werden, wenn z. 

$facebook->getUser(); und dann im selben Handler $facebook->getLogoutUrl(), dann wird getCode() zweimal aufgerufen, was zu einer ungültigen Fehlermeldung führt

8
Jimmy Kane

Nun, ich habe dieses genaue Problem einmal festgestellt und hatte ein Problem mit den Parametern state & code in der URL - meine .htaccess-Datei hat sie nicht weitergeleitet.

Ich vermute, Sie haben das gleiche Problem.

Das CSRF-Status-Token stimmt nicht mit einem angegebenen überein

Hoffe das hilft

3
Roni

Ein weiterer Hinweis: Obwohl dies nicht in der Dokumentation der API für Facebook PHP angegeben ist, müssen Sie Apache für PHP -Sitzungen konfiguriert haben, damit der Anmeldeprozess funktioniert. Das stellte sich als das Problem heraus, das wir hatten, als wir das CSRF-Status-Token erhalten haben, das nicht mit einem bereitgestellten übereinstimmt. 

Stellen Sie sicher, dass Sie, wenn Sie einen Serverpool verwenden, für den die Verwendung von Memcache für Sitzungsinformationen eingerichtet ist, andernfalls schreibt Apache die Sitzungsinformationen lokal, und wenn die nächste Anforderung nicht an denselben Server geht, wird der CSRF-Status angezeigt Das Token stimmt nicht mit einem angegebenen überein ". 

Dies war eines der Dinge, die in einer Entwicklungsumgebung (mit einem Server) wie ein Zauber funktionierten, aber in der Produktion fehlgeschlagen sind. 

Wir mussten auch unsere CDN-Einstellungen neu konfigurieren, um sicherzustellen, dass wir das Session-Cookie PHP durchlaufen. 

2
Joanne Garlow

Ich hatte das gleiche Problem. Es ist einfach. Rufen Sie nicht an 

$fbLoginUrl = $facebook->getLoginUrl(...);

vor 

$fbUser = $facebook->getUser();

andernfalls erhalten Sie den Fehler "CSRF-Status-Token entspricht keinem angegebenen".

2
spurs50

Um der Antwort von chesles etwas hinzuzufügen, kann dieses Problem auftreten, wenn Sie mit den Funktionen session_start () - session_write_close () wie ich spielen.

Wenn beim Anfordern der loginUrl keine Sitzung gestartet wird, wird diese Fehlermeldung angezeigt.

Nebenanmerkung: Warum sollte ich die Sitzung beenden?

Skripts, die Sitzungen verwenden, werden gegenseitig angehalten, da sie darauf warten, dass das Sitzungsarray verwendet werden kann.

Stellen Sie sich vor, Sie haben eine beliebte Anwendung mit Tausenden von Benutzern und haben eine Aktion (ein PHP-Skript), in der Sie ein Bild posten .

- Starten Sie die Sitzung oben im Skript

--verbinde zu Facebook

- das bild erstellen

- Teilen des Bildes mit dem API-Aufruf

--script beendet, Sitzung wird automatisch geschlossen

Dabei wird die Sitzung ohne Grund lange Zeit vom Skript verwendet .. __ Seien Sie vorsichtig mit solchen Skripten, verwenden Sie stattdessen Folgendes:

- Starten Sie die Sitzung, bevor Sie das Facebook-Objekt erstellen

--verbinde zu Facebook

- Schließen der Sitzung mit session_write_close (), dem Sitzungsarray steht zur Verfügung, andere Skripte können geladen werden

- das bild erstellen

- das Bild mit dem api-Aufruf teilen/* Es wird davon ausgegangen, dass keine Sitzung erforderlich ist. * /

- Skript beendet, Sitzung bereits manuell geschlossen.

Prost.

2
ZeeCoder

Ich hatte das gleiche Problem auf meinem lokalen Rechner, und es stellte sich heraus, dass meine hosts-Datei die Kommunikation mit Verisign blockierte. Daher versucht die URL, mit der Facebook zu kommunizieren versucht, ( http://crl.verisign.com /pca3.crl ) hat nie funktioniert (Stand: 404).

Das Auskommentieren der verschiedenen Verisign-IP-Adressen aus meiner Hosts-Datei hat den Trick bewirkt!

1
Guillermo

CSRF-Status und -Code werden mit lokalen Sitzungen überprüft. Ich wette, Sie müssen Ihren session.save_handler in Ihrer php.ini überprüfen und prüfen, ob er ordnungsgemäß funktioniert hat.

0
Antoine Baqain

wenn Sie Umleitungen mit .htaccess mod auf Ihrer Seite neu schreiben, verwenden Sie den [QSA] (Query String Append) am Ende der Zeilen, um die GET-Variablen beizubehalten. Andernfalls haben Sie die $ code-Variable verloren, die für die Facebook-Anmeldung erforderlich ist 

0
askdig