it-swarm.com.de

Der "state" -Parameter von URL und Sitzung stimmt nicht überein

In Facebook-Dokumentation 

require('include/facebook/autoload.php'); //SDK directory
$fb = new Facebook\Facebook([
'app_id' => '***********',
'app_secret' => '***********************'
]);

$helper = $fb->getRedirectLoginHelper();
$permissions = ['email', 'public_profile']; // optional
$loginUrl = $helper->getLoginUrl('http://www.meusite.com.br/login-callback.php', $permissions);

Bei der Weiterleitung an die URL $ loginUrl lautet die Rückgabe: Das SDK von Facebook hat einen Fehler zurückgegeben: Die Überprüfung der Überprüfung von Anfragen für fälschungsübergreifende Anforderungen ist fehlgeschlagen. Der "state" -Parameter von URL und Sitzung stimmt nicht überein

16
Pedro Henrique

Ich hatte den gleichen Fehler. 

Das Problem trat auf, weil ich getLoginUrl (...) vor getAccessToken () 

Befreien Sie sich also von getLoginUrl (...) in umgeleiteter URL und Code.

28
tasmaniski

Ich hatte das gleiche Problem und für mich trat der Fehler auf, weil ich session_start(); nicht in meinen login.php page-Code eingefügt habe, bevor ich getLoginUrl (..) und auch oben in login- callback.php page.

Fügen Sie einfach session_start(); in Ihre " login " - Seite und " login-callback " - Seite ein, und es wird sicher so funktionieren, wie es jetzt für mich funktioniert.

17
gauravparmar

Für diesen Fehler kann es zwei Gründe geben:

  1. sie haben session_start(); nicht vor getLoginUrl aufgerufen
  2. Sie haben getLoginUrl erneut in login-callback.php ausgeführt, der Zustandswert wurde neu generiert und mit dem umgeleiteten Wert nicht übereinstimmen
5
Shaon

Mögliche Korrekturen: Ich habe die folgenden Konfigurationseinstellungen verwendet.

Aktivieren Sie WebAuthLogin auf der Registerkarte "Erweitert". Geben Sie die URL in den WebAuthLogin-Einstellungen wie in $ loginUrl an.

Wenn Sie beispielsweise $ loginUrl als https://example.com/ verwenden, verwenden Sie dasselbe in der WebAuthlogin-URL $ LoginUrl = $ helper-> getLoginUrl (' https://example.com/ ', $ Berechtigungen);

4
Tom Freek

Dieses Problem tritt auch auf, wenn Sie zwei oder mehr Anmeldelinks auf derselben Seite generieren (z. B. einen für die Anmeldung und einen für die Registrierung - selbst wenn beide auf dieselbe URL verweisen, sie haben nur unterschiedliche Bezeichnungen). 

Facebook SDK erstellt/aktualisiert $ _SESSION [FBRLH_state] für jede neu generierte loginURL. Wenn also 2 generierte URLs (mit $ helper-> getLoginUrl ()) vorhanden sind, wird $ _SESSION [FBRLH_state] zweimal umgeschrieben und gilt nur für die zuletzt generierte URL. Vorherige Login-URL wird ungültig. Dies bedeutet, dass es nicht möglich ist, 2 gültige loginURLs zu generieren. Falls 2 gleiche URLs generiert werden, geben Sie die erste URL zurück und vermeiden Sie den Aufruf des Facebook SDK zur Generierung der zweiten URL.

4
Mojo

Ich hatte das gleiche Problem.

Der Grund für diesen Fehler ist weil --->

Wenn "$ helper-> getLoginUrl" aufgerufen wird, wird eine Sitzungsvariable "FB_State" erstellt. Dies ist etwas, das der FB verwendet, um das Token abzugleichen. Bei jedem Aufruf von getLoginUrl wird ein neuer Status erstellt. Wenn der Benutzer dieses Ereignis autorisiert hat und zurückgeleitet hat, kann dieses Problem auftreten, wenn Sie dieses Ereignis nicht erkennen und "$ helper-> getLoginUrl" erneut ausführen können.

Die Lösung ->

  1. verfeinern Sie Ihre Codierung, stoppen Sie "$ helper-> getLoginUrl" erneut, wenn Sie autorisiert sind.

  2. wenn Sie bereits eine erneute Ausführung durchführen, setzen Sie die Sitzungsvariable für das Token auf NULL, falls dies der Fall ist, und der Benutzer kann die Berechtigung erneut autorisieren.

  3. wenn der Benutzer eine erneute Autorisierung versucht, kann er die autorisierte APP einmal entfernen oder Sie müssen einen neuen Link mit "$ helper-> getReRequestUrl" erstellen.

Token wurde jedoch von "getAccessToken ()" aufgerufen, bevor "$ helper-> getLoginUrl" oder "$ helper-> getReRequestUrl" ausgeführt wird.

Viel Glück!!!!!

3
Micah

Beim Betrachten des FB-Codes entdeckte ich schließlich, dass das Problem "Überprüfung der Überprüfung der Quittierung von Anforderungen fehlgeschlagen ist. Erforderlicher Parameter" fehlender Status "und ähnliche Variablen durch die PHP -Variable $ _SESSION ['FBRLH_state'] für einige" seltsamer "Grund, wenn der FB die Login-Callback-Datei aufruft.

Zur Lösung speichere ich diese Variable "FBRLH_state" NACH dem Aufruf der Funktion $ helper-> getLoginUrl (...). Ist sehr wichtig, nur zu tun, wenn der Aufruf dieser Funktion innerhalb dieser Funktion ist, wenn die Variable $ _SESSION ['FBRLH_state'] gefüllt ist.

Unten ein Beispiel für meinen Code in der login.php:

$uri=$helper->getLoginUrl($uri, $permissions);
foreach ($_SESSION as $k=>$v) {                    
    if(strpos($k, "FBRLH_")!==FALSE) {
        if(!setcookie($k, $v)) {
            //what??
        } else {
            $_COOKIE[$k]=$v;
        }
    }
}
var_dump($_COOKIE);

Und in der login-callback.php vor dem Aufruf des gesamten FB-Codes:

foreach ($_COOKIE as $k=>$v) {
    if(strpos($k, "FBRLH_")!==FALSE) {
        $_SESSION[$k]=$v;
    }
}

Denken Sie außerdem daran, auch Code für die Sitzung mit PHP anzugeben.

if(!session_id()) {
    session_start();
}
...
...
...
...
<?php session_write_close() ?>

Ich hoffe, diese Antwort kann Ihnen helfen, 8-10 Stunden Arbeit zu sparen:) Tschüss, Alex.

2
ale500

Ich hatte den gleichen Fehler. Verwenden Sie 1 Datei oder 2? Ich habe versucht, mit einer Datei zu arbeiten, aber mein Fehler wurde behoben, als ich mich in login.php & fb-callback.php aufteilte, wie in der empfohlenen Dokumentation. Meine Sitzungen wurden neu geschrieben, so dass der Zustand nie richtig gespeichert wurde.

Viel Glück!

1
Erica

Dieses Problem war für mich etwas verwirrend, da ich eine Zeile in der Facebook-SRC-Datei ändern musste:

src/Facebook/Helpers/FacebookRedirectLoginHelper.php

bei der Funktion: "validateCsrf" wie folgt:

if ($result !== 0) {
        throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.');
    }

Und ändere es in:

if ($result === 0) {
        throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.');
    }

Ich weiß nicht, ob dies einen Verstoß gegen die Facebook-SDK-Sicherheit darstellt, daher habe ich wirklich jede Erklärung oder Empfehlung für diese Antwort geöffnet. 

Sie können auch folgende Änderungen am Facebook-App-Manager vornehmen: 

fügen Sie Ihrem Facebook-App-Konto Ihre Website und die Callback-URL hinzu: 

setting->advanced:Valid OAuth redirect URIs

Vergessen Sie nicht, eine weitere URL mit Schrägstrich (/) am Ende jeder URL hinzuzufügen und alle 4 Kontrollkästchen unter Client OAuth Settings zu markieren.

1
Tarek

Geschieht, wenn in der Sitzung eine erforderliche Variable fehlt . Dies kann auf verschiedene Ursachen zurückzuführen sein. In meinem Fall habe ich das "www" aus der Callback-URL entfernt 

0
Roy Toledo