12

Вопрос по facebook, php – Как продлить / расширить токены доступа в Facebook с помощью PHP?

Facebook удалил функцию токена offline_access, теперь токены должны обновляться всякий раз, когда пользователь посещает ваш сайт, чтобы они оставались активными.

Скажем, кто-то уже предоставил доступ к вашему веб-сайту, и у вас есть для него токен. Какой код вы бы использовали с PHP-библиотекой Facebook для обновления этого токена?

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от Click Upvote
  • Error: User Rate Limit Exceeded

    от Click Upvote
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededpublish_streamError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • @zerkms, я заблудился в документации API api, так что, может быть, вы можете быстро ответить на это. Вы говорите, что пока пользователь авторизует мое приложение для набора разрешений, мне не нужно предоставлять какие-либо токены доступа в моих вызовах PHP API (получение или публикация) в Facebook (в пределах разрешенных установленных разрешений), если я указываю APP ID и приложение секретно? Благодарю.

    от Alexey Gerasimov
  • тогда вам просто нужно получитьpublish_stream разрешение (developers.facebook.com/docs/authentication/permissions/…, Смотри описание ). Пока он у вас есть - вы можете просто публиковать обновления без пользовательских токенов.

    от zerkms
  • @zerkms Если пользователь щелкает, чтобы поделиться историей в своем профиле на моем веб-сайте, то я бы хотел использовать Ajax для публикации истории в своем профиле FB без необходимости каждый раз перенаправлять его на Facebook.

    от Click Upvote
  • @zerkms Тогда какие токены точки доступа, для чего они используются сейчас?

    от Click Upvote
  • Для чего вы используете токены? Если у вас достаточно разрешений - вам не нужно извлекать и хранить токены пользовательских сессий, а просто использовать прикладные токены.

    от zerkms
  • 0

    Вот что я сейчас делаю

    public function setExtendAccessToken($accessToken = NULL) {
    
    enter code here
        if(!$accessToken) return;
    
        $graphUrl = 'https://graph.facebook.com/oauth/access_token?client_id='.$facebookAppId.
                    '&client_secret='.$facebookSecret.
                    '&grant_type=fb_exchange_token&fb_exchange_token='.$accessToken;
        $accessToken = @file_get_contents($graphUrl);
        parse_str($accessToken); //get the access_token param in the string and would be named $access_token
        if(!$access_token) $access_token = $accessToken; //if cannot be extended then just return the access token with 2 hours expiry
        return $access_token;
    }
    

  • 0

    Ref:

    use Facebook\FacebookSession;
    use Facebook\GraphSessionInfo;
    use Facebook\FacebookRequest;
    use Facebook\GraphUser;
    use Facebook\FacebookRequestException;
    use Facebook\FacebookRedirectLoginHelper;
    
        FacebookSession::setDefaultApplication('YOURAPPID', 'SECRET');
    
        $user_accessToken = $_COOKIE['access_token_facebook']
    
        $session = new FacebookSession($user_accessToken);
    
        try {
            $session->validate();
        } catch (FacebookRequestException $ex) {
            // When Facebook returns an error
            echo $ex->getMessage();
        } catch (\Exception $ex) {
            // When validation fails or other local issues
            echo $ex->getMessage();
        }
        if ($session) {
            // Exchange token for long token
            $longToken = $session->getExchangeToken();
            // ... your other stuff
        }
    

    https://developers.facebook.com/docs/facebook-login/access-tokens#pagetokens https://developers.facebook.com/docs/facebook-login/access-tokens#extending

  • 1

    Updated

    Да, @zerkms верен, access_token не требуется, если у приложения есть разрешение.

    With this permission, you can publish content to a user's feed at any time. However, please note that Facebook recommends a user-initiated sharing model. Please read the Platform Policies to ensure you understand how to properly use this permission. Note, you do not need to request the publish_stream permission in order to use the Feed Dialog, the Requests Dialog or the Send Dialog.

    Все расширенные разрешения имеют схожие права:https://developers.facebook.com/docs/authentication/permissions/

  • 8

    Вы можете расширить свой токен следующим образом:

    Оригинальный сценарий

    Your app requests permissions from the user You prompt user to log in / grant permissions You get user's token (short-lived one) and exchange via CURL or other means for a 60 day one using grant_type=fb_exchange_token You persist the token

    Теперь у вас есть этот токен, чтобы делать с ним что угодно на срок до 60 дней. До, потому что пользователь может изменить пароль, деавторизовать приложение и т. Д., И токен станет недействительным. Чтобы продлить токен, вы можете КАЖДЫЙ ВРЕМЯ, когда пользователь заходит на ваши страницы, вы можете проверить, вошли ли они через javascript и, если они есть, сделать ajax-вызов на сервер, чтобы продлить существующий токен на 60 дней с сегодня. Вы можете сделать столько звонков, сколько хотите, только первый действителен. Вот как я это делаю:

    On your page somewhere during load event, add something like:

     FB.getLoginStatus(function (response) {
         if (response.status === 'connected') {
            $.ajax({
                type: "POST",
                async: false,
                url: YOUR_URL,
                dataType: "text",
                data: {token  : response.authResponse.accessToken }
             });
         }
     });
             //rest of jquery ajax call here
    

    Это получит новый клиентский токен доступа для пользователя и отправит его на сервер

    Server can then take that token and exchange it for a 60 day one

    $token_url = "https://graph.facebook.com/oauth/access_token?client_id=".FACEBOOK_CLIENT_ID."&client_secret=".FACEBOOK_SECRET."&grant_type=fb_exchange_token&fb_exchange_token=".$token;
    
    $c = curl_init();
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($c, CURLOPT_URL, $token_url);
    $contents = curl_exec($c);
    $err  = curl_getinfo($c,CURLINFO_HTTP_CODE);
    curl_close($c);
    
    $paramsfb = null;
    parse_str($contents, $paramsfb);        
    

    Ссылка:

    https://developers.facebook.com/roadmap/offline-access-removal/

    Это расширит маркер, только если пользователь вернется на ваш сайт в течение 60 дней. Если нет, вам нужно будет снова запросить разрешения.