Isolution666
@Isolution666
Full-Stack Developer

Как исправить ошибку «An active access token must be used to query information about the current user»?

Здравствуйте.
--
Сделал код согласно документации 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, там данные приходят, но и маркер я там получаю по клику, как он там рисуется не понятно.

Вопрос: как победить этот баг, кто нашёл решение?
  • Вопрос задан
  • 411 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы