it-swarm.com.ru

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

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

23
Harry Andrei

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

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

35
jches

Код 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() вызывается дважды, что приводит к ошибочному сообщению об ошибке

8
Jimmy Kane

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

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

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

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

3
Roni

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

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

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

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

2
Joanne Garlow

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

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

до 

$fbUser = $facebook->getUser();

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

2
spurs50

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Приветствия.

2
ZeeCoder

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

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

1
Guillermo

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

0
Antoine Baqain

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

0
askdig