Ответ 1
У меня была такая же ошибка.
Проблема возникла из-за того, что я сделал getLoginUrl (...) до getAccessToken()
Так избавиться от getLoginUrl (...) в перенаправленном URL-адресе и коде должен работать.
В facebook documantion
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);
Когда он направляется на url $loginUrl, возвращается: Facebook SDK вернул ошибку: проверка подделки на основе перекрестного запроса не удалась. Параметр "состояние" из URL-адреса и сеанса не соответствует
У меня была такая же ошибка.
Проблема возникла из-за того, что я сделал getLoginUrl (...) до getAccessToken()
Так избавиться от getLoginUrl (...) в перенаправленном URL-адресе и коде должен работать.
У меня была такая же проблема, и для меня эта ошибка возникала, потому что я не помещал session_start();
в свой код login.php перед вызовом getLoginUrl (..), а также в верхней части страницы login-callback.php.
Просто поместите session_start();
на страницу " login" и " имя входа-обратного вызова", и она будет работать точно так же, как сейчас работает для меня.
Возможные исправления: Я использовал следующие настройки конфигурации.
Включить WebAuthLogin на вкладке "Дополнительно". Укажите URL-адрес в настройках WebAuthLogin так же, как и в $loginUrl;
Например, если вы используете $loginUrl как https://example.com/, используйте то же самое в URL-адресе WebAuthlogin $ loginUrl = $helper- > getLoginUrl ('https://example.com/', $permissions);
Для этой ошибки может быть 2 причины:
session_start();
перед тем, как getLoginUrl
вызыватьgetLoginUrl
снова в login-callback.php
, поэтому значение состояния восстановлено и несовместимо с перенаправленным значениемЭта проблема возникает и в случае, если вы создаете 2 или более логин-ссылки на одной странице (например, один для входа и другой для регистрации - даже оба указывают на один и тот же URL-адрес, у них только разные метки).
Facebook SDK создает/обновляет $_SESSION [FBRLH_state] для каждого нового сгенерированного loginURL. Итак, если есть 2 сгенерированных URL-адреса (используя $helper- > getLoginUrl()), то $_SESSION [FBRLH_state] 2 раза переписывается и действует только для последнего сгенерированного URL-адреса. Предыдущий URL-адрес входа в систему становится недействительным. Это означает, что невозможно создать 2 действительных loginURL. В случае создания 2 одинаковых URL-адресов, верните первый и избегите вызова SDK для генерации второго.
У меня была та же проблема.
Причиной этой ошибки является то, что --- >
При вызове "$ helper- > getLoginUrl" создается переменная сеанса "FB_State", и это то, что FB использует для соответствия токену. Каждый раз getLoginUrl вызывает, он создает новое состояние. Затем, после авторизации и перенаправления пользователя, если коды не могут обнаружить это событие и повторно запустить "$ helper- > getLoginUrl", тогда эта ошибка произойдет.
Решение →
уточните свое кодирование, снова запустите "$ helper- > getLoginUrl", если это разрешено.
если вы уже перезапустили, затем установите для переменной сеанса для токена значение NULL, если у вас есть, затем пользователь может снова авторизовать.
когда пользователь пытается повторить авторизацию, они могут удалить разрешенный APP один раз или вам нужно создать новую ссылку с помощью "$ helper- > getReRequestUrl"
Тем не менее, токен вызывается "getAccessToken()" перед запуском "$ helper- > getLoginUrl" или "$ helper- > getReRequestUrl".
Удачи!!!!!
Наконец, просмотрев код FB, я обнаружил, что проблема "Проверка подделки на основе перекрестного сайта" не удалась. Обязательное состояние "отсутствует" и "аналогичные параметры" вызвано переменной PHP $_SESSION ['FBRLH_state'], которая для некоторых "странных" Причина, когда FB вызывает файл обратного вызова login.
Чтобы решить эту проблему, я сохраняю эту переменную "FBRLH_state" ПОСЛЕ вызова функции $helper- > getLoginUrl (...). Очень важно делать это только после вызова этой функции из-за того, что внутри этой функции находится переменная $_SESSION ['FBRLH_state'].
Ниже пример моего кода в 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);
И в login-callback.php перед вызовом всего кода FB:
foreach ($_COOKIE as $k=>$v) {
if(strpos($k, "FBRLH_")!==FALSE) {
$_SESSION[$k]=$v;
}
}
И последнее, но не менее важное, помните также, чтобы включить код для сеанса PHP, поэтому..
if(!session_id()) {
session_start();
}
...
...
...
...
<?php session_write_close() ?>
Я надеюсь, что этот ответ поможет вам сэкономить 8-10 часов работы:) Пока, Алекс.
Эта проблема была немного запутанной для меня, потому что мне пришлось изменить строку в файле facebook src:
src/Facebook/Helpers/FacebookRedirectLoginHelper.php
в функции: "validateCsrf" следующим образом:
if ($result !== 0) {
throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.');
}
И измените его на:
if ($result === 0) {
throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.');
}
Я не знаю, является ли это нарушением безопасности на фейсбуке SDK, поэтому я действительно открыл любую экзанизацию или рекомендацию для этого ответа.
Вы также можете внести следующие изменения в диспетчер приложений facebook:
добавьте свой сайт и обратный вызов в свою учетную запись приложения facebook по адресу:
setting->advanced:Valid OAuth redirect URIs
Не забудьте добавить еще один URL-адрес с косой чертой (/) в конце каждого URL-адреса и проверить все 4 флажка в настройках клиента OAuth.
У меня была такая же ошибка. Вы используете 1 файл или 2? Я пытался получить с помощью 1 файла, но моя ошибка была решена, когда я разделил на login.php и fb-callback.php, как рекомендовал документация. Мои сеансы были переписаны, поэтому состояние никогда не сохранялось должным образом.
Удачи!
Случается, когда сеанс отсутствует в переменной. может быть вызвано несколькими вещами. В моем случае я оставил "www" вне URL обратного вызова
Фактически вы можете разбирать данные из другого домена... например: website.com отличается от www.website.com
Если вы анализируете данные с http://website.com/login.php на http://www.website.com/fb-callback.php, это будет кросс- проблема с доменом и ошибка, которую вы получаете, будет из-за этого....
http://website.com и http://www.website.com те же, но script идентифицирует их как разные..... надеюсь, что дает представление о проблеме.