it-swarm.com.de

Facebook PHP SDK 5 :: API 2.4 :: Fehler bei der Überprüfung der standortübergreifenden Anforderungsfälschung. Erforderlicher Parameter "state" fehlt

Ich habe ein sehr einfaches PHP -Skript gemacht, nur um sich über Facebook anzumelden und ein AccessToken zu erhalten. Wenn ich den folgenden Code ausprobiere, erhalte ich eine Ausnahme vom SDK: «Die Validierung der Überprüfung der Standortübergreifenden Anforderungsfälschung ist fehlgeschlagen. Erforderlicher Parameter "state" fehlt. ».

Hier ist mein Code:

require_once __DIR__ . '/facebook-sdk-v5/autoload.php';
session_start();

$fb = new Facebook\Facebook([
    'app_id' => '{my-own-app-id}',
    'app_secret' => '{my-own-app-secret}'
]);

// Check to see if we already have an accessToken ?
if (isset($_SESSION['facebook_access_token'] )) {
    $accessToken = $_SESSION['facebook_access_token'];
    echo "Horray we have our accessToken:$accessToken<br />\n";

} else {
    // We don't have the accessToken
    // But are we in the process of getting it ? 
    if (isset($_REQUEST['code'])) {
        $helper = $fb->getRedirectLoginHelper();
        try {
            $accessToken = $helper->getAccessToken();
            } catch(Facebook\Exceptions\FacebookResponseException $e) {
              // When Graph returns an error
              echo 'Graph returned an error: ' . $e->getMessage();
              exit;
        } catch(Facebook\Exceptions\FacebookSDKException $e) {
              // When validation fails or other local issues
              echo 'Facebook SDK returned an error: ' . $e->getMessage();
            exit;
        }

        if (isset($accessToken)) {
              // Logged in!
              $_SESSION['facebook_access_token'] = (string) $accessToken;

              // Now you can redirect to another page and use the
              // access token from $_SESSION['facebook_access_token']

              echo "Finally logged in! Token:$accessToken";
        }           
    } else {
        // Well looks like we are a fresh dude, login to Facebook!
        $helper = $fb->getRedirectLoginHelper();
        $permissions = ['email', 'user_likes']; // optional
        $loginUrl = $helper->getLoginUrl('http://mywebsite.com/myapp/index.php', $permissions);

        echo '<a href="' . $loginUrl . '">Log in with Facebook!</a>';
    }

}

exit;
12
Éric Senterre

Ich musste diese Zeilen auf einigen Servern hinzufügen:

$helper = $fb->getRedirectLoginHelper();
if (isset($_GET['state'])) {
    $helper->getPersistentDataHandler()->set('state', $_GET['state']);
}

Ich bekomme diesen Fehler zufällig, abhängig von der Server-Konfiguration.

22
M.Dalda

session_start () am Anfang beider Skripte. Ich habe eine Lösung von hier: https://github.com/facebook/facebook-php-sdk-v4/issues/473

9
Ruhul Amin

Wenn Sie eine "www" -Version Ihrer Website verwenden, um den Login-Link zu generieren, und Sie werden zur Nicht-www-Version weitergeleitet, treten Probleme mit Ihrer Sitzung auf. Stellen Sie daher sicher, dass Sie auf die WWW-Version Ihrer Site zugreifen, und definieren Sie dann die Callback-URL auf dieselbe WWW-Version. Sie können auch permanente Weiterleitungen in Ihrer Serverkonfiguration definieren, um sicherzustellen, dass jeder, der von der nicht-www-Version auf Ihre Website zugreift, zur www-Version umgeleitet wird oder umgekehrt.

9
che-azeh

Ich bin auch auf das gleiche Problem gestoßen und habe nach der Stackoverflow Putting Line geforscht 

$_SESSION['FBRLH_state']=$_GET['state']; 

oben hat mein Problem gelöst 

$helper = $fb->getRedirectLoginHelper();  
3
ashutosh

Dies ist ein häufiges Problem, mit dem viele Leute in FB Api konfrontiert sind. Dies ist nur ein SITZUNGS-Problem. Um dieses Problem zu lösen, fügen Sie Code wie hinzu.

Bei einem Callback-Skript fügt fb-callback.php normalerweise "session_start ();" Kurz bevor Sie die Facebook-Autoload-Datei einfügen. und dann "$ _SESSION ['FBRLH_state'] = $ _ GET ['state'];" nach dem "$ helper = $ fb-> getRedirectLoginHelper ();" Linie. 

Beispiel: 

<?php 
session_start(); /*Add session start*/
include 'vendor/autoload.php';
include 'config.php'; /*Facebook Config*/
$helper = $fb->getRedirectLoginHelper();
$_SESSION['FBRLH_state']=$_GET['state']; /*Add This*/
try {
  $accessToken = $helper->getAccessToken();
} ?>

Wenn Sie [PersistentDataHandler] explizit festlegen, bevor Sie Ihre Token erhalten, wird sichergestellt, dass die Anforderung erfolgreich ist. Nachfolgend wird gezeigt, wie Sie $ _GET ['state'] abrufen und einfach in den zu verwendenden [Helper] von Symfony 2.x | einfügen 3.x

Ich hatte genau das gleiche Problem wie der O. P. und dieses Problem wurde behoben.

//create your new facebook sdk instance
$this->fb = new Facebook([
   'app_id' => $facebookAppId,
   'app_secret' =>$facebookAppSecret,
   'default_graph_version' =>$facebookDefaultGraphVersion
]);    

//retrieve the helper
$this->helper = $this->fb->getRedirectLoginHelper();

//below is the money shot
//setting this explicitly before you get your tokens will guarantee that the request will be a success. It Fetches $_GET['state'] & simply injects it into the "to be used [helper]"
$this->helper->getPersistentDataHandler()->set('state', $request->query->get('state'));
2
Dan Baddeley

sie erhalten diese Fehlermeldung, wenn sich der Origin-Hostname von dem nach der Authentifizierung angegebenen Ziel-Hostnamen unterscheidet.

$loginUrl = $helper->getLoginUrl('http://mywebsite.com/myapp/index.php', $permissions);

mit dieser aussage, wenn der besucher auf ihrer website http://www.mywebsite.com/ verwendet wird, wird der standortübergreifende fehler ausgelöst.

Sie müssen sicherstellen, dass Origin und Zielhostname genau identisch sind, einschließlich des eventuellen www-Präfixes.

Feste Version:

$loginUrl = $helper->getLoginUrl('http://'.$_SERVER['SERVER_NAME'].'/myapp/index.php', $permissions);
2
Jean.R

Ich stieß auf ein ähnliches Problem und fand die Lösung von Nanang Koesharwanto. Es ist eher eine Verschnörkelung, da das Ändern von Quelldateien im Herstellerverzeichnis eine sehr schlechte Idee ist. Also hier ist der Trick. 

public function callback(Request $request)
{
    $this->helper->getPersistentDataHandler()->set('state', $request->state);
    return $this->helper->getAccessToken();
}

Wenn dies fehlschlägt, legen Sie use Session; in Ihren Controller ein.

1
Rajender Joshi

Ich habe versucht, das Facebook-Login in Symfony mit Facebook PHP SDK zu implementieren, und ich hatte den gleichen Fehler "Überprüfung der Überprüfung der Quelltexte für Anfragen ist fehlgeschlagen. Erforderlicher Parameter" state "missing".

Ich habe das Problem durch Hinzufügen von persistent_data_handler parameter zu meiner Facebook-App-Instanzierung mit einem benutzerdefinierten Handler gelöst, der das PersistentDataInterface von Facebook PHP SDK implementiert.

Klappt wunderbar.

public function facebookCallbackAction(Request $request) {
    $session = $request->getSession();

    $fb = new \Facebook\Facebook([
        'app_id' => $this->container->getParameter('facebook_app_id'),
        'app_secret' => $this->container->getParameter('facebook_app_secret'),
        'default_graph_version' => 'v2.5',
        'persistent_data_handler' => new SymfonyPersistentDataHandler($session),
    ]);
}

Mein Custom Handler:

use Facebook\PersistentData\PersistentDataInterface;
use Symfony\Component\HttpFoundation\Session\Session;

class SymfonyPersistentDataHandler implements PersistentDataInterface {
    protected $session;
    protected $sessionPrefix = 'FBRLH_';

    public function __construct(Session $session) {
        $this->session = $session;
    }

    public function get($key) {
        return $this->session->get($this->sessionPrefix . $key);
    }

    public function set($key, $value) {
        $this->session->set($this->sessionPrefix . $key, $value);
    }
}
1
Julien F.

Laravel 5.2

Ich habe auch diesen Fehler "Cross-Site Request Forgery-Validierung fehlgeschlagen. Erforderlicher Parameter" Status "fehlt".

und nachdem ich dies stundenlang gelesen habe. Ich habe versucht, das Kreditorenskript zu ändern.

in vendor\facebook\php-sdk-v4\src\Facebook\Helpers\FacebookRedirectLoginHelper.php in Zeile 123 ändere ich dieses Skript:

private function makeUrl($redirectUrl, array $scope, array $params = [], $separator = '&')
{
    $state = $this->pseudoRandomStringGenerator->getPseudoRandomString(static::CSRF_LENGTH);
    $this->persistentDataHandler->set('state', $state);

    return $this->oAuth2Client->getAuthorizationUrl($redirectUrl, $state, $scope, $params, $separator);
}

in (ich füge Session::put('state', $state); hinzu)

private function makeUrl($redirectUrl, array $scope, array $params = [], $separator = '&')
{
    $state = $this->pseudoRandomStringGenerator->getPseudoRandomString(static::CSRF_LENGTH);
    $this->persistentDataHandler->set('state', $state);
    Session::put('state', $state);
    return $this->oAuth2Client->getAuthorizationUrl($redirectUrl, $state, $scope, $params, $separator);
}

und in Zeile 234 ändere ich dieses Skript:

protected function validateCsrf()
{
    $state = $this->getState();
    $savedState = $this->persistentDataHandler->get('state');

    if (!$state || !$savedState) {
        throw new FacebookSDKException('Cross-site request forgery validation failed. Required param "state" missing.');
    }

    $savedLen = strlen($savedState);
    $givenLen = strlen($state);

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

    $result = 0;
    for ($i = 0; $i < $savedLen; $i++) {
        $result |= ord($state[$i]) ^ ord($savedState[$i]);
    }

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

in (ich habe $this->persistentDataHandler->set('state', Session::get('state')); hinzugefügt)

protected function validateCsrf()
{
    $state = $this->getState();
    $this->persistentDataHandler->set('state', Session::get('state'));
    $savedState = $this->persistentDataHandler->get('state');

    if (!$state || !$savedState) {
        throw new FacebookSDKException('Cross-site request forgery validation failed. Required param "state" missing.');
    }

    $savedLen = strlen($savedState);
    $givenLen = strlen($state);

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

    $result = 0;
    for ($i = 0; $i < $savedLen; $i++) {
        $result |= ord($state[$i]) ^ ord($savedState[$i]);
    }

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

das ist alles was ich getan habe. und der Fehler ist weg.

1

Für mich ist das Problem jetzt gelöst, wenn Sie die Sitzung mit folgendem Befehl beginnen:

session_start();

am Anfang beider Dateien (die erste Datei, die eine Facebook-URL generiert, und die Rückrufdatei: login.php und fb-callback.php ( https://developers.facebook.com/docs/php/howto/example_facebook_login ) ).

Ich musste auch folgendes hinzufügen:

$config['app_id'] = 'myapp_id';

an der Spitze von, um einen anderen nicht verwandten Fehler zu vermeiden.

1
Adam Tong
1
Chao Chen

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 verursacht." 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.

0
ale500

Das eigentliche Problem war hier die Kodierung meiner PHP -Datei. Ich habe UTF8 verwendet, aber es sollte UTF8 ohne Stückliste sein.

Der Nebeneffekt der falschen Kodierung war, dass meine SESSION nicht ordnungsgemäß funktionierte und das SDK die erforderlichen Informationen nicht abrufen konnte, um ordnungsgemäß zu funktionieren. 

Eine ordnungsgemäß konfigurierte Fehlermeldung hätte ergeben, dass ein Problem aufgetreten ist. 

Ich denke, dass wir diesen Fehler in der "Noob" -Kategorie füllen können. Aber ich denke, es kann für andere Noobs wie mich nützlich sein. 

0
Éric Senterre

Wenn session_start () das Problem nicht immer noch löst, fügen Sie einen falschen URI in den Valid OAuth Redirect-URI Ihrer Facebook-Entwickler-App ein. 

Um zu lösen: Gehen Sie zuerst zu Ihrer fb-callback.php und suchen Sie den URI, den Sie in die Header-Funktion eingeben, zum Beispiel: header ("Location: https: //localhost/home.php "). Wechseln Sie dann zu Ihren Facebook-Entwickler-Apps. Klicken Sie dann in der Seitenleiste auf Facebook-Login. Klicken Sie dazu auf der Registerkarte Produkte auf Einstellungen und dann auf Einstellungen. Fügen Sie in den Valid OAuth Redirect-URIs den URI hinzu, den Sie in den Header eingeben. Aus meinem Beispiel werde ich https: //localhost/home.php einfügen. 

Hoffe das hilft.

sie müssen sicherstellen, dass die Sitzung beginnt, bevor das Skript ausgeführt wird. Es wird jedoch erneut ein 443: Network is unreachable ausgegeben, wenn Sie eine Sitzung erneut mit demselben Skript starten. hoffe das hilft jemandem.

Ich habe gerade verwendet if (session_status() == PHP_SESSION_NONE){ session_start(); } 

0
Tharindu

Denjenigen von euch, die cakephp 3.x verwenden und dieses Problem haben und keine Ahnung haben, wie sie es lösen sollen. Add session_start (); am Anfang Ihrer auth- und callback-Methode. 

public function Facebookauth()
{
session_start();
 $fb = new Facebook([
      'app_id' => '{app_id}',
      'app_secret' => '{app_secret}',
      'default_graph_version' => 'v2.6',
     ..........

    ]);

you can still use 
     $session = $this->request->session();
0

Die Lösung für mich bestand darin, 'secure' => true in false in config/session.php ..__ zu ändern. Ich hatte dies aus Versehen auf true gesetzt, während ich https überhaupt nicht verwendete.

0
Jonas Menk

Für mich geschah dies aufgrund von 'persistent_data_handler' . Durch das Hinzufügen in Facebook config konnte ich es funktionieren lassen.

session_start();
$fb = new Facebook\Facebook([
  'app_id'     => '6XXXXXXXXX',
  'app_secret' => '5XXXXXXXXXXXXXX',
  'default_graph_version' => 'v2.6', 
  'persistent_data_handler' => 'session'
  ]);
0
Amit Tyagi

Für mich hat die Lösung die Ausnahme durch Ersetzen des Namensbereichs Facebook\Exceptions\FacebookSDKException in Exception aufgefangen, da das Skript sie bereits verwendet hat.

use Facebook\Facebook;

// code ...

$fb = new Facebook([
    'app_id' => FB_APP_ID,
    'app_secret' => FB_APP_SECRET,
    'default_graph_version' => 'v2.5',
]);

$helper = $fb->getRedirectLoginHelper();
try {
    $accessToken = $helper->getAccessToken();
} catch (Exception $e) {
    echo $e->getMessage();
    exit;
}
0
michalzuber