Проблема с входом в Facebook, который не соответствует токену состояния CSRF - PullRequest
5 голосов
/ 08 сентября 2011

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

В настоящее время я пытаюсь ввести логин Facebook на своем веб-сайте, и у меня возникают проблемы с аутентификацией при входе.из-за htaccess мод перезаписывает URL-адреса?

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

domain.com/view_webhosting.php?webhosting=name

Но как только я перехожу кURL перезаписи мода

domain.com/webhosting-name/

Тогда он просто не работает и выдает ошибку "Токен состояния CSRF не соответствует предоставленному."

в файле htaccess выглядит так

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L]

У кого-нибудь есть решение такой проблемы?Я использую Facebook SDK v3.1.1

Ответы [ 7 ]

7 голосов
/ 08 сентября 2011

Спасибо, Бисмарк.

Вы были правы; он не мог получить параметры GET, и решение было таким:

От

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L]

до

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [QSA,L]

Строка запроса append [QSA]

•'qsappend|QSA' (query string append)
This flag forces the rewrite engine to append a query string part of the substitution string
to  the existing string, instead of replacing it. Use this when you want to add more data
to the query string via a rewrite rule.

Спасибо, ребята, поставьте меня на правильный путь!

7 голосов
/ 08 сентября 2011

PHP SDK ожидает, что поле 'state' будет находиться в $ _REQUEST (я верю как параметр GET) после перенаправления, прежде чем вы сможете обменять 'код' на токен доступа.Из base_facebook.php:

protected function getCode() {
  if (isset($_REQUEST['code'])) {
    if ($this->state !== null &&
      isset($_REQUEST['state']) &&
      $this->state === $_REQUEST['state']) {

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

  return false;
}

Ваш RewriteRule может растоптать этот параметр.

2 голосов
/ 08 сентября 2011

Полагаю, вы имеете в виду PHP SDK?

Похоже, вы не передаете переменную запроса 'state' в ваш PHP-скрипт. Вы читали https://developers.facebook.com/docs/authentication/ (в частности, биты и защита от CSRF?).

Кроме того, я предполагаю, что это опечатка в вашем вопросе, но не должно ли быть ваше правило переписывания:

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?**webhosting**=$1 [L]
1 голос
/ 08 сентября 2011

Попробуйте изменить RewriteRule на

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L,QSA]

QSA = Строка запроса. Добавить.Это гарантирует, что вы не потеряете свои параметры GET.

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

0 голосов
/ 28 ноября 2012

Я исправил это (забыв), чтобы сопоставить область / разрешения из приложения с разрешениями на странице developers.facebook.com/app ... (т.е. перейти в настройки приложения, разрешения).

0 голосов
/ 22 октября 2012

Если кто-то все еще получает эту ошибку после файла .htaccess, я предлагаю изменить параметр redirect_uri в файле PHP, а также URL-адрес сайта в настройках приложения Facebook.

Я решил эту ошибку, изменив с

http:domain.com/folder

до

http:domain.com/folder/index.php

...