Параметр "состояние" из 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-адреса и сеанса не соответствует

Ответы

Ответ 1

У меня была такая же ошибка.

Проблема возникла из-за того, что я сделал getLoginUrl (...) до getAccessToken()

Так избавиться от getLoginUrl (...) в перенаправленном URL-адресе и коде должен работать.

Ответ 2

У меня была такая же проблема, и для меня эта ошибка возникала, потому что я не помещал session_start(); в свой код login.php перед вызовом getLoginUrl (..), а также в верхней части страницы login-callback.php.

Просто поместите session_start(); на страницу " login" и " имя входа-обратного вызова", и она будет работать точно так же, как сейчас работает для меня.

Ответ 3

Возможные исправления: Я использовал следующие настройки конфигурации.

Включить WebAuthLogin на вкладке "Дополнительно". Укажите URL-адрес в настройках WebAuthLogin так же, как и в $loginUrl;

Например, если вы используете $loginUrl как https://example.com/, используйте то же самое в URL-адресе WebAuthlogin $ loginUrl = $helper- > getLoginUrl ('https://example.com/', $permissions);

Ответ 4

Для этой ошибки может быть 2 причины:

  • вы не вызывали session_start(); перед тем, как getLoginUrl вызывать
  • Вы выполнили getLoginUrl снова в login-callback.php, поэтому значение состояния восстановлено и несовместимо с перенаправленным значением

Ответ 5

Эта проблема возникает и в случае, если вы создаете 2 или более логин-ссылки на одной странице (например, один для входа и другой для регистрации - даже оба указывают на один и тот же URL-адрес, у них только разные метки).

Facebook SDK создает/обновляет $_SESSION [FBRLH_state] для каждого нового сгенерированного loginURL. Итак, если есть 2 сгенерированных URL-адреса (используя $helper- > getLoginUrl()), то $_SESSION [FBRLH_state] 2 раза переписывается и действует только для последнего сгенерированного URL-адреса. Предыдущий URL-адрес входа в систему становится недействительным. Это означает, что невозможно создать 2 действительных loginURL. В случае создания 2 одинаковых URL-адресов, верните первый и избегите вызова SDK для генерации второго.

Ответ 6

У меня была та же проблема.

Причиной этой ошибки является то, что --- >

При вызове "$ helper- > getLoginUrl" создается переменная сеанса "FB_State", и это то, что FB использует для соответствия токену. Каждый раз getLoginUrl вызывает, он создает новое состояние. Затем, после авторизации и перенаправления пользователя, если коды не могут обнаружить это событие и повторно запустить "$ helper- > getLoginUrl", тогда эта ошибка произойдет.

Решение →

  • уточните свое кодирование, снова запустите "$ helper- > getLoginUrl", если это разрешено.

  • если вы уже перезапустили, затем установите для переменной сеанса для токена значение NULL, если у вас есть, затем пользователь может снова авторизовать.

  • когда пользователь пытается повторить авторизацию, они могут удалить разрешенный APP один раз или вам нужно создать новую ссылку с помощью "$ helper- > getReRequestUrl"

Тем не менее, токен вызывается "getAccessToken()" перед запуском "$ helper- > getLoginUrl" или "$ helper- > getReRequestUrl".

Удачи!!!!!

Ответ 7

Наконец, просмотрев код 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 часов работы:) Пока, Алекс.

Ответ 8

Эта проблема была немного запутанной для меня, потому что мне пришлось изменить строку в файле 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.

Ответ 9

У меня была такая же ошибка. Вы используете 1 файл или 2? Я пытался получить с помощью 1 файла, но моя ошибка была решена, когда я разделил на login.php и fb-callback.php, как рекомендовал документация. Мои сеансы были переписаны, поэтому состояние никогда не сохранялось должным образом.

Удачи!

Ответ 10

Случается, когда сеанс отсутствует в переменной. может быть вызвано несколькими вещами. В моем случае я оставил "www" вне URL обратного вызова

Ответ 11

Фактически вы можете разбирать данные из другого домена... например: 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 идентифицирует их как разные..... надеюсь, что дает представление о проблеме.