web-dev-qa-db-fra.com

Le paramètre "state" de l'URL et de la session ne correspond pas

Dans la documentation facebook 

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);

Lorsque vous le dirigez vers l'URL $ loginUrl, le retour est le suivant: Le SDK Facebook a renvoyé une erreur: la validation de la falsification de la requête intersite a échoué. Le paramètre "state" de l'URL et de la session ne correspond pas

16
Pedro Henrique

J'ai eu la même erreur. 

Le problème est dû au fait que j'ai getLoginUrl (...) avant getAccessToken () 

Donc, débarrasser de getLoginUrl (...) dans les URL redirigées et le code devrait fonctionner.

28
tasmaniski

J'ai eu le même problème et pour moi cette erreur se produisait parce que je n'avais pas mis session_start(); dans mon code login.php page avant d'appeler getLoginUrl (..) et aussi en haut de login- callback.php page.

Il suffit de mettre session_start(); dans votre page " login " et " login-callback " et cela fonctionnera sûrement comme si cela fonctionnait pour moi maintenant.

17
gauravparmar

Il pourrait y avoir 2 raisons pour cette erreur:

  1. vous n'avez pas appelé session_start(); avant l'appel getLoginUrl
  2. Vous avez exécuté getLoginUrl à nouveau dans login-callback.php, donc la valeur de l'état est régénérée et incompatible avec la valeur redirigée.
5
Shaon

Solutions possibles: J'ai utilisé les paramètres de configuration suivants.

Activez WebAuthLogin sous l'onglet Avancé. Indiquez l'URL dans les paramètres WebAuthLogin de la même manière que celle fournie dans $ loginUrl;

Par exemple, si vous utilisez $ loginUrl en tant que https://exemple.com/ utilisez-le dans l’URL WebAuthlogin $ LoginUrl = $ helper-> getLoginUrl (' https://example.com/ ', $ permissions);

4
Tom Freek

Ce problème se produit également si vous générez au moins deux liens de connexion sur la même page (par exemple, un pour la connexion et d’autres pour l’enregistrement - même si les deux renvoient à la même URL, ils n’ont que des étiquettes différentes). 

Le SDK Facebook crée/met à jour $ _SESSION [état FBRLH] pour chaque nouvelle URL de connexion générée. Donc, s'il y a 2 URL générées (en utilisant $ helper-> getLoginUrl ()), alors le $ _SESSION [état FBRLH] est réécrit 2 fois et n'est valide que pour la dernière URL générée. L'URL de connexion précédente devient invalide. Cela signifie qu'il n'est pas possible de générer 2 loginURL valides. Si 2 mêmes URL sont générés, renvoyez le premier et évitez l’appel du kit de développement logiciel (SDK) Facebook pour générer le deuxième.

4
Mojo

J'ai eu le même problème.

La raison de cette erreur est parce que --->

Lorsque "$ helper-> getLoginUrl" appelle, il crée une variable de session "FB_State", ce que le FB utilise pour faire correspondre le jeton. Chaque fois que getLoginUrl appelle, il crée un nouvel état. Ensuite, après autorisation de l'utilisateur et redirection, si vos codes ne peuvent pas détecter cet événement et réexécuter "$ helper-> getLoginUrl", cette erreur se produira.

La solution ->

  1. affinez votre codage, arrêtez de nouveau l'exécution de "$ helper-> getLoginUrl" si elle est autorisée.

  2. si vous avez déjà réexécuté, définissez la variable de session du jeton sur NULL si vous avez déjà défini, puis l'utilisateur peut ré-autoriser à nouveau.

  3. lorsque l'utilisateur tente de réautoriser, il peut supprimer l'application autorisée une fois ou vous devez générer un nouveau lien avec "$ helper-> getReRequestUrl"

Pourtant, le jeton a été appelé par "getAccessToken ()" avant l'exécution de "$ helper-> getLoginUrl" ou "$ helper-> getReRequestUrl".

Bonne chance!!!!!

3
Micah

Enfin, en examinant le code FB, j’ai découvert que le problème "La validation de la demande intersite a échoué. Les paramètres" état "manquant" et autres sont causés par la variable PHP $ _SESSION ['FBRLH_state' "pour certains" étrange "lorsque FB appelle le fichier login-callback.

Pour le résoudre, je stocke cette variable "FBRLH_state" APRES l'appel de la fonction $ helper-> getLoginUrl (...). Il est très important de ne le faire qu'après l'appel de cette fonction car c'est à l'intérieur de celle-ci que la variable $ _SESSION ['FBRLH_state'] est renseignée.

Ci-dessous un exemple de mon code dans le 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);

Et dans le fichier login-callback.php avant d'appeler tout le code FB:

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

Dernier point, mais non le moindre, n'oubliez pas d'inclure également du code pour la session PHP.

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

J'espère que cette réponse pourra vous aider à économiser 8 à 10 heures de travail:) Bye, Alex.

2
ale500

J'ai eu la même erreur. Utilisez-vous 1 fichier ou 2? J'essayais d'obtenir en utilisant 1 fichier mais mon erreur a été résolue lorsque je me suis séparé en login.php & fb-callback.php comme documentation recommandée Mes sessions étaient en cours de réécriture afin que l'état ne soit jamais sauvegardé correctement.

Bonne chance!

1
Erica

Cette question était un peu déroutante pour moi, car je devais changer une ligne dans le fichier src de facebook:

src/Facebook/Helpers/FacebookRedirectLoginHelper.php

à la fonction: "validateCsrf" comme ceci:

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

Et changez-le en:

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

Je ne sais pas si cela constitue une violation de la sécurité du kit de développement logiciel (SDK) facebook, alors je me suis vraiment ouvert à toute recommandation ou exlanation de cette réponse. 

Vous pouvez également apporter les modifications suivantes au gestionnaire de l'application facebook: 

ajoutez votre site et votre URL de rappel à votre compte d'application facebook à l'adresse: 

setting->advanced:Valid OAuth redirect URIs

N'oubliez pas d'ajouter une autre URL avec une barre oblique (/) à la fin de chaque URL et de cocher les 4 cases à cocher sous Paramètres OAuth du client.

1
Tarek

Cela se produit lorsque la session qui manque une variable nécessaire . Peut être causée par plusieurs facteurs. Dans mon cas, j'ai laissé le "www" dans l'URL de rappel 

0
Roy Toledo