Я сделал очень простой скрипт PHP, просто чтобы попытаться войти через Facebook и получить accessToken. Но когда я пробую следующий код, я получаю исключение из SDK: «Проверка подделки межсайтовых запросов не удалась. Обязательный параметр «состояние» отсутствует. ».
Вот мой код:
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;
Мне пришлось добавить эти строки в некоторых серверах:
$helper = $fb->getRedirectLoginHelper();
if (isset($_GET['state'])) {
$helper->getPersistentDataHandler()->set('state', $_GET['state']);
}
Я получаю эту ошибку случайно, в зависимости от конфигурации сервера.
session_start () в начале обоих скриптов. Я получил решение здесь: https://github.com/facebook/facebook-php-sdk-v4/issues/473
Если вы используете версию своего сайта «www» для создания ссылки для входа в систему, и вы будете перенаправлены на версию без www, у вас возникнут проблемы с вашей сессией. Поэтому убедитесь, что у вас есть доступ к www-версии вашего сайта, а затем определите URL-адрес обратного вызова для той же www-версии. Кроме того, вы можете определить постоянные перенаправления в конфигурации вашего сервера, чтобы гарантировать, что любой, кто обращается к вашему сайту из версии без www, будет перенаправлен на версию www или наоборот.
Я также столкнулся с той же проблемой, и после исследования на стеке потока
положить линию
$_SESSION['FBRLH_state']=$_GET['state'];
выше решил мою проблему
$helper = $fb->getRedirectLoginHelper();
Вы получаете эту ошибку, если ваше имя хоста источника отличается от целевого имени хоста после аутентификации.
$loginUrl = $helper->getLoginUrl('http://mywebsite.com/myapp/index.php', $permissions);
с этим утверждением, если посетитель на вашем сайте использовал http://www.mywebsite.com/ межсайтовая ошибка будет поднята.
Вы должны убедиться, что источник и целевое имя хоста в точности совпадают, включая возможный префикс www.
Фиксированная версия:
$loginUrl = $helper->getLoginUrl('http://'.$_SERVER['SERVER_NAME'].'/myapp/index.php', $permissions);
Явная установка [PersistentDataHandler] до получения ваших токенов гарантирует, что запрос будет успешным. Ниже показано, как получить $ _GET [‘state’] & просто вставьте его в «to be used [helper]» в Symfony 2.x | 3.x
У меня была та же проблема, что и у О.П., и это исправило мою проблему.
//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'));
Это общая проблема, с которой многие сталкиваются в FB Api. это только проблема СЕССИИ. Чтобы решить эту проблему, добавьте код, например.
В сценарии обратного вызова обычно fb-callback.php добавить «session_start ();» непосредственно перед включением файла автозагрузки facebook. а затем «$ _SESSION [‘FBRLH_state’] = $ _ GET [‘state’];» после «$ helper = $ fb-> getRedirectLoginHelper ();» линия.
Пример :
<?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();
} ?>
Для меня проблема решена, просто начав сеанс, добавив:
session_start();
в начале обоих файлов (первый файл, генерирующий URL-адрес facebook и файл обратного вызова: login.php и fb-callback.php (https://developers.facebook.com/docs/php/howto/example_facebook_login)).
Я также должен был добавить это:
$config['app_id'] = 'myapp_id';
вверху, чтобы предотвратить еще одну не связанную ошибку.