Я просто обновился до PHP 5.4.19 и facebook–php-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>'; }