Здравствуйте.
--
Сделал код согласно документации
https://developers.facebook.com/docs/php/howto/exa...
, (только в Yii), всё работает, но когда приближается последний этап для получения данных о пользователе, вылезает ошибка:
An active access token must be used to query information about the current user
Мой код:
<?php
namespace ...\...\models;
use Yii;
use Facebook\Facebook;
class FaceBookModel
{
public $appId; // Yii::$app->facebook->appId
public $appSecret; // Yii::$app->facebook->appSecret
public $defaultGraphVersion; // Yii::$app->facebook->defaultGraphVersion
public $urlRedirect; // Yii::$app->facebook->urlRedirect
public function fb()
{
return $fb = new Facebook([
'app_id' => Yii::$app->facebook->appId,
'app_secret' => Yii::$app->facebook->appSecret,
'default_graph_version' => Yii::$app->facebook->defaultGraphVersion,
]);
}
public function getTokenFB()
{
$helper = self::fb()->getRedirectLoginHelper();
$permissions = ['email','public_profile']; // Optional permissions
$loginUrl = $helper->getLoginUrl(Yii::$app->facebook->urlRedirect, $permissions);
return $loginUrl;
}
// state
public function getState()
{
$parts = parse_url(self::getTokenFB());
parse_str($parts['query'], $query);
session_start();
$_SESSION['fb_access_token'] = $query['state'];
return $_SESSION['fb_access_token'];
}
public function getUser()
{
$_SESSION['fb_access_token'] = (string) $accessToken;
$accessToken = Yii::$app->facebook->appId.'|'.Yii::$app->facebook->appSecret;
try {
$response = self::fb()->get(
'/me?fields=id,name,email,first_name,last_name,picture,gender', $accessToken
);
} catch(\Facebook\Exceptions\FacebookResponseException $e) {
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(\Facebook\Exceptions\FacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
$graphNode = $response->getGraphNode();
var_dump($graphNode);
}
}
Понятное дело, что мешает жить "state" - я настроил, что при клике он записывается в сессию, а оттуда потом вставляется в ссылку обработки, токен, как в принципе везде, зашифровывается из двух ключей, клиентского и секретного поэтому можно выводить склеенный ключ по дэфолту.
$helper = $fb->getRedirectLoginHelper();
Не позволяет получать токен, возможно это баг, когда вывожу массив, его значения пустые, читал на сайте разработчиков Facebook, они признаются, что документация устарела, и применима только к версии
v2.0
Но у меня версия
v4.0 - если делать строго по написанному, то вообще ничего не работает. Ощущение, что state создаётся два раза, хотя в консоли и в адресной строке он одинаковый. Чтобы вы понимали, я говорю про state который приходит из facebook, когда происходит редирект. Вся эта пляска с бубнами только лишь для того, чтобы проверить соответствия между сайтом отправителем и сайтом получателем - если они не совпадают, маркер получается не правильный и авторизация не проходит валидацию. Я тестировал данные через Facebook Developer, там данные приходят, но и маркер я там получаю по клику, как он там рисуется не понятно.
Вопрос: как победить этот баг, кто нашёл решение?