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

Я пытаюсь войти в систему fb через домен, используя API-интерфейс графа.

введите здесь описание изображения

Я получаю сообщение об ошибке «Facebook SDK вернул ошибку: проверка подделки межсайтового запроса не удалась. Обязательный параметр «состояние» отсутствует в постоянных данных»

Код шага 1:

$fb = new \Facebook\Facebook([
              'app_id'                => $this->appId,
              'app_secret'            => $this->appSecret,
              'default_graph_version' => $this->apiVersion,
    ]);

    $permissions = [
                    'email',                        
                    'manage_pages', 
                    'business_management',
                    'ads_management'
                    ];

    $helper    = $fb->getRedirectLoginHelper();
    $loginUrl  = $helper->getLoginUrl($this->redirectUrl.'?back_to='.$customer_website_url, $permissions);

Код шага 3

$fb = new \Facebook\Facebook([
  'app_id'                => $appId,
  'app_secret'            => $appSecret,
  'default_graph_version' => $graph_api_version,
]);

$helper = $fb->getRedirectLoginHelper();
$accessToken = $helper->getAccessToken();

Все, что я объяснил на изображении, так что у кого может быть проблема и возможное решение?


person Jass    schedule 04.11.2016    source источник
comment
Параметр state сохраняется в сеансе при создании URL-адреса входа. Таким образом, перенаправление обратно в приложение из Facebook должно идти в тот же домен, потому что именно там находится сеанс.   -  person CBroe    schedule 04.11.2016


Ответы (1)


Сначала проверьте, использует ли ваш PHP-скрипт кодировку UTF8 или **UTF8 без BOM. Иногда это вызывает проблемы, это может произойти из-за каких-то других причин, одной из которых является обработка СЕССИИ. Я получаю эту ошибку, когда пытаюсь нажать кнопку «Назад» и «Вперед» в браузере: D

Шаг 3 будет php-скриптом обратного вызова, опубликованным в приложении Fb, где Facebook перенаправит пользователя после получения разрешений приложения Fb. Если он другой или домен другой, вы можете получить это.

Вы также можете установить параметр state вручную.

Попробуй это

В вашем коде шага 3 после получения токена доступа преобразуйте его в долгоживущий токен, установите токен доступа в сеансе и проверьте наличие токена доступа. >GET параметр, который вы передаете на основе этого перенаправления на страницу

$fb = new \Facebook\Facebook([
  'app_id'                => $appId,
  'app_secret'            => $appSecret,
  'default_graph_version' => $graph_api_version,
]);

$helper = $fb->getRedirectLoginHelper();
$accessToken = $helper->getAccessToken();
$oAuth2Client = $fb->getOAuth2Client();

if (!$accessToken->isLongLived()) {
    // Exchanges a short-lived access token for a long-lived one
    try {
        $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
    } catch (Facebook\Exceptions\FacebookSDKException $e) {
        echo "<p>Error getting long-lived access token: " . $helper->getMessage() . "</p>\n\n";
        exit;
    }
}

// You can also store this access token in database for future use
$_SESSION['fb_access_token'] = (string) $accessToken;

if (isset($_GET['back_to']) and $_GET['back_to'] == '<any_specific_value>') {
    header("Location: <specific page>");
    exit();
} else {
    // User is logged in with a long-lived access token.
    // You can redirect them to a members-only page.
    header("Location: <default page>");
    exit();
}

<specific page>/<default page>, используя fb_access_token из сеанса, вы можете запросить Facebook Graph/Marketing API.

После этого, если вы храните токен доступа в базе данных, в коде шага 1 вы можете проверить, есть ли у вас уже токен доступа. strong> конкретного пользователя или нет.

// Query database for Access token of the user

if (exists) {
    // Fetch access Token and use it
} else {
    $fb = new \Facebook\Facebook([
              'app_id'                => $this->appId,
              'app_secret'            => $this->appSecret,
              'default_graph_version' => $this->apiVersion,
    ]);

    $permissions = [
        'email',                        
        'manage_pages', 
        'business_management',
        'ads_management'
    ];

    $helper    = $fb->getRedirectLoginHelper();
    $loginUrl  = $helper->getLoginUrl($this->redirectUrl.'?back_to='.$customer_website_url, $permissions);
}
person Haridarshan    schedule 04.11.2016
comment
реальная проблема заключается в том, что из-за двух разных доменов я не смог получить токен доступа к своему домену, потому что запрос был отправлен с домена клиента. - person Jass; 07.11.2016
comment
Любая идея о stackoverflow .com/questions/40483537/ ? - person Jass; 08.11.2016
comment
Спецификация была проблемой для меня - person Matías Cánepa; 02.04.2020