Intereting Posts
PDO с запросами «WHERE … IN» Установка даты истечения срока действия или максимального возраста в заголовках HTTP Создание ссылки в dataGrid Отображение всех изображений из сообщения WordPress Является ли htmlspecialchars достаточным для предотвращения SQL-инъекции переменной, заключенной в одинарные кавычки? Ошибка: Предупреждение: strpos () : смещение не содержится в строке – не удается найти решение Печать PHP, выполняющего стек вызовов из-за пределов PHP Получение полного URL-адреса текущей страницы (PHP) Модификация регулярного выражения для соответствия времени Php, чтобы заменить @username ссылкой на аккаунт Twitter Как преобразовать строку в код utf-8 в php Запрос списка заказов magento Предупреждение о безопасности PhpMyAdmin для файлов конфигурации PHP rand () … получить результаты 50/50? Требуется регулярное выражение для соответствия специальным ситуациям

Facebook: «Этот код авторизации был использован.», «Type»: «OAuthException», «code»: 100

Я просто обновился до PHP 5.4.19 и facebookphp-sdk-v4.

Это только я или FB сделал интеграцию сознательно трудной ?! Например, я не использую Composer (не могу установить его на свой общий хост), поэтому для загрузки новых классов требуется конкретный (для самостоятельного) заказа – этого было достаточно головной боли! Предлагаемое решение по адресу http://metah.ch/blog/2014/05/facebook-sdk-4-0-0-for-php-a-working-sample-to-get-started/ было не совсем правильным.

Во всяком случае, когда я, наконец, получил его для запуска и включил «App Secret Proof for Server API calls» на вкладке «Дополнительные настройки приложения», как рекомендовал Facebook, я попал в ловушку 22.

Это оно:

1) Сделать вызов FB API с моего сервера, например $request = new FacebookRequest($session, 'GET', '/me'); Теперь я должен предоставить аргумент appsecret_proof.

2) Чтобы создать appsecret_proof, мне нужен access_token, то есть $appsecret_proof= hash_hmac('sha256', $access_token, $app_secret); ,

3) Чтобы получить access_token только с $ _GET ['code'] в этот момент, я должен выполнить обмен кодами через GET https://graph.facebook.com/oauth/access_token? client_id={app-id} &redirect_uri={redirect-uri} &client_secret={app-secret} &code={code-parameter} GET https://graph.facebook.com/oauth/access_token? client_id={app-id} &redirect_uri={redirect-uri} &client_secret={app-secret} &code={code-parameter} .

4) Чтобы вызвать FB для обмена кодами, я получаю сообщение об ошибке {"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}} .

Поэтому возникают два вопроса:

1) Как еще я могу получить access_token, кроме как через обмен кодами, чтобы я мог использовать этот токен для создания appsecret_proof и, в свою очередь, вызвать FacebookRequest?

2) Где / Как помещать эти appsecret_proof в FacebookRequest? Возможно, это так: $request = new FacebookRequest($session, 'GET', '/me', array("appsecret_proof" => $appsecret_proof)); ? Я не могу найти конкретную инструкцию о том, как использовать appsecret_proof с PHP API (ясно, как это сделать через http с помощью Graph API).

Дамы и господа, я решил все это – мне просто нужно было использовать $access_token = $session->getToken(); , Это помогло мне свести на нет призыв к кодовому обмену, который вызывал OAuthException, потому что Facebook с тех пор изменил свою политику на код обмена от использования более одного раза.

Теперь «App Secret Proof for Server API calls» правильно включен на вкладке «Расширенные настройки приложения», как рекомендовано Facebook.

Таким образом, конкретное решение в комплекте:

 $app_id = 'APPID'; $app_secret = 'APPSECRET'; FacebookSession::setDefaultApplication($app_id, $app_secret); $redirect_url = "https://mydomain.com/login"; $helper = new FacebookRedirectLoginHelper($redirect_url); try { $session = $helper->getSessionFromRedirect(); } catch (FacebookRequestException $ex) { } catch (Exception $ex) { } if (isset($session)) { $access_token = $session->getToken(); $appsecret_proof = hash_hmac('sha256', $access_token, $app_secret); $request = new FacebookRequest($session, 'GET', '/me', array("appsecret_proof" => $appsecret_proof)); $response = $request->execute(); $graphObject = $response->getGraphObject(); echo print_r($graphObject, 1); } else { echo '<a href="' . $helper->getLoginUrl() . '">Login</a>'; }