Маркер состояния CSRF не соответствует предоставленному FB PHP SDK 3.1.1 Oauth 2.0 - PullRequest
23 голосов
/ 23 января 2012

В журналах моего сервера показана ошибка «Маркер состояния CSRF не соответствует одному предоставленному», который, по-видимому, возникает почти у каждого пользователя.Тем не менее, пользователи создаются и / или аутентифицируются, и я могу получить информацию о пользователе.Я использую сервер Linux с Apache.Я также использую последнюю версию Facebook PHP SDK v.3.1.1. Может кто-нибудь сказать мне, почему это происходит и как это исправить?

Ответы [ 9 ]

35 голосов
/ 20 февраля 2012

У меня была похожая проблема на прошлой неделе, и я отследил ее до поля state, перезаписываемого несколькими вызовами на getLoginUrl(). Каждый раз, когда вы вызываете getLoginUrl(), новый токен state генерируется в SDK и сохраняется в $_SESSION (это просто случайное значение), поэтому, если вы вызываете его дважды, и пользователь использует первую ссылку для входа в систему второй вызов сбросит внутренний токен state SDK, и вы получите эту ошибку в своих журналах.

SDK ищет тот же токен state в URL-адресе, который возвращается после того, как Facebook авторизует пользователя и перенаправляет его обратно на ваш сайт, и, если он не совпадает, регистрирует эту ошибку (вот ссылка на источник ).

8 голосов
/ 01 декабря 2013

Код Facebook SDK содержит ошибку при двойной проверке токенов в одном и том же обработчике.

Я отредактировал функцию getCode facebook.php следующим образом:

protected function getCode() {
    if (!isset($_REQUEST['code']) || !isset($_REQUEST['state']) || $this->state === null) {
      return false;
    }
    if ($this->state === $_REQUEST['state']) {
        // CSRF state has done its job, so clear it
        $this->state = null;
        $this->clearPersistentData('state');
        return $_REQUEST['code'];
    }
    self::errorLog('CSRF state token does not match one provided.');

    return false;
}

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

Для ясности функция может быть вызвана дважды для одного и того же обработчика URL, например:

$facebook->getUser(); и затем в том же обработчике $facebook->getLogoutUrl(), затем getCode() вызывается дважды, что приводит к неверному сообщению об ошибке

3 голосов
/ 16 февраля 2012

Что ж, я однажды столкнулся с этой проблемой, и у меня была проблема с параметрами state & code в URL - мой .htaccess файл не пересылал их.

Полагаю, у вас та же проблема.

Маркер состояния CSRF не соответствует предоставленному

Надеюсь, это поможет

2 голосов
/ 12 августа 2014

У меня была такая же проблема.Это просто.Не звоните

$fbLoginUrl = $facebook->getLoginUrl(...);

до

$fbUser = $facebook->getUser();

, в противном случае вы получите сообщение об ошибке «Маркер состояния CSRF не соответствует одному предоставленному».

2 голосов
/ 24 мая 2013

Еще одно примечание - хотя это не указано в документации по API PHP Facebook, для работы входа в систему необходимо настроить apache для сеансов PHP.Это оказалось проблемой, с которой мы столкнулись, когда получали «токен состояния CSRF не соответствует предоставленному».

Убедитесь, что вы используете пул серверов, для которого вы настроили использование memcache для информации о сеансе, иначе apache запишет информацию о сеансе локально, и если следующий запрос не перейдет на тот же сервер, который выполучит «токен состояния CSRF не соответствует предоставленному».

Это была одна из тех вещей, которая работала как очаровательная вещь в среде разработки (с одним сервером), но не работала на производстве.

Нам также пришлось перенастроить наши настройки CDN, чтобы убедиться, что мы проходили через cookie-файл PHP Session.

2 голосов
/ 27 февраля 2013

Чтобы добавить немного в ответ Чесла, эта проблема может возникнуть, если вы играете с функциями session_start () - session_write_close (), как я это сделал.

Если при запуске нет запущенного сеансаповторно запрашивая loginUrl, вы получите эту ошибку.

Sidenote: зачем прерывать сеанс?

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

Представьте, что у вас есть популярное приложение с тысячами пользователей, и у вас есть действие (скрипт php), где вы публикуете картинку.Примерно так:

- начало сеанса вверху скрипта

- подключение к фейсбуку

- создание изображения

-совместное использование изображения с вызовом API

- конец сценария, сессия закрывается автоматически

При этом сценарий будет использоваться сценарием долгое время без причины.Будьте осторожны с такими сценариями, используйте что-то вроде этого:

- начать сеанс прямо перед тем, как вы создадите объект facebook

- подключиться к facebook

- закрытьсеанс с помощью session_write_close (), массив сессий доступен, другие скрипты могут загружаться

- создание образа

- совместное использование изображения с вызовом API / * Думаю, в этом нет необходимостисеанс.* /

- конец скрипта, сессия уже закрыта вручную.

Cheers.

1 голос
/ 29 мая 2013

У меня была такая же проблема на моем локальном компьютере, и проблема оказалась в том, что мой файл хостов блокировал связь с Verisign, поэтому URL-адрес, с которым пытается связаться Facebook (http://crl.verisign.com/pca3.crl))никогда не работал (состояние: 404).

Комментируя различные IP-адреса Verisign из моего файла hosts, добился цели!

0 голосов
/ 10 февраля 2014

если вы используете .htaccess мод переписывать перенаправления на вашей странице, используйте [QSA] (Query String Append) в конце строк, чтобы сохранить переменные GET, или вы потеряли переменную $ code, которая требуется для логин Facebook

0 голосов
/ 01 октября 2013

Состояние CSRF и код проверяются с использованием локальных сессий, держу пари, что вам нужно проверить файл session.save_handler в вашем php.ini и убедиться, что он работает правильно.

...