Получение долговременного токена доступа с помощью setExtendedAccessToken () возвращает краткосрочный токен

Я пытаюсь получить расширенный долгоживущий токен доступа с помощью

$facebook->setExtendedAccessToken(); $access_token = $facebook->getAccessToken(); 

После просмотра SDK я обнаружил, что функция setExtendedAccessToken () устанавливает долговременный токен доступа в

 protected static $kSupportedKeys = array('state', 'code', 'access_token', 'user_id'); 

с

 $this->setPersistentData( 'access_token', $response_params['access_token'] ); 

и getAccessToken () возвращает кратковременный токен доступа из

 protected $accessToken 

поэтому в чем цель setExtendedAccessToken (), поскольку он ничего не возвращает?

@Julian. Большое вам спасибо за вдохновение здесь. Я смог выполнить эту работу, не меняя ни одного из основных файлов api FB.

Случается, что вызов setExtendedAccessToken отправляет значение setPersistentData которое затем отправляет его в сеанс через constructSessionVariableName .

Поэтому, если мы выберем его вне сеанса, а затем установите его в объект facebook, мы все настроены.

Вот мой код:

 // ask for the extended token and get it from session ... $facebook->setExtendedAccessToken(); $access_token = $_SESSION["fb_".FB_APP_ID."_access_token"]; // now set it into the facebook object .... $facebook->setAccessToken($access_token); // now our fb object will use the new token as usual ... $accessToken = $facebook->getAccessToken(); 

После дальнейших попыток base_facebook.php по base_facebook.php , я обнаружил следующее:

  • setExtendedAccessToken(); обменяются недолгосрочным токеном доступа, и Facebook вернет правильный токен доступа.
  • setExtendedAccessToken(); сохраняет это в постоянном кэше данных, но это не означает getAccessToken(); может получить к нему доступ, поскольку getAccessToken(); не запрашивает постоянный кеш. Кроме того, класс, по-видимому, рассматривает постоянные данные как «отказоустойчивые» и использует его только в том случае, если все другие попытки получить данные потерпели неудачу (то есть после проверки signed_request и анализа code ).
  • В нашем случае маркер доступа возвращается через setExtendedAccessToken(); это самый последний токен доступа, поэтому я взломал исправление. Добавьте следующую строку внизу setExtendedAccessToken();

    // Also set the publically accessible access token value to this new extended token

    $this->accessToken = $response_params['access_token'];

  • Предостережение . Несмотря на то, что теперь у нас появился новый расширенный токен доступа, последующие запросы в Facebook для получения токена доступа (например, после обновления страницы) возвращают тот же старый токен с недолгосрочным доступом. * Facepalm *

  • Даже после выхода пользователя из системы (что приведет к истечению срока действия кратковременного токена), и снова войдет в систему, Facebook снова вернет кратковременный токен доступа.
  • Однако, хотя это так, setExtendedAccessToken(); вернет тот же самый расширенный токен доступа, который вы получили ранее. Этот токен по-прежнему может запрашивать информацию пользователя.

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


Оригинальный ответ

Согласно этому ответу , новый токен доступа сохраняется в постоянных данных (как вы указали и в своем вопросе), и к ним можно получить доступ через $facebook->getAccessToken(); ,

Две важные примечания:

  • На этой странице также упоминается, что, когда токен токенового обмена обменивается на токен расширенного доступа, сам токен может или не может измениться , хотя время истечения срока действия должно быть обновлено, чтобы отразить более длительное истечение срока действия. Возможно, когда вы вызываете $facebook->getAccessToken(); , вы просто получаете тот же знак назад, но его срок действия изменился?
  • Вызов обменивать токен с недолгосрочным доступом для расширенного может быть сделан только один раз в день для каждого пользователя . Я не знаю, почему это так, и я не знаю, сбрасывается ли этот счетчик, если пользователь решает отменить авторизацию вашего приложения и повторно авторизировать.

Из документации в Facebook:

Когда пользователь посещает ваш сайт с помощью существующего, действительного, недолгого пользователя access_token, у вас есть возможность продлить срок действия этого токена доступа. Наша платформа будет продлевать срок действия только один раз в день , поэтому, даже если пользователь повторно просматривает ваш сайт несколько раз в день, токен будет продлен в первый раз. (акцент мой)

Я считаю, что это так, потому что неряшливые программисты вызовут $facebook->setExtendedAccessToken(); при каждой возможной возможности, в надежде всегда получить расширенный токен доступа. (Вместо предпочтительного поведения, которое будет вызывать только $facebook->setExtendedAccessToken(); если то, что у вас есть в настоящее время, – это токен с краткосрочным доступом, но как бы вы сказали, если вы не сохранили дату истечения срока действия, само по себе не так уж и надежно …!)

Мое предположение заключается в том, что если пользователь отменяет авторизацию приложения или токен в противном случае делает недействительным, предел будет сброшен, и вы сможете снова получить токен расширенного доступа при передаче в токене краткосрочного доступа. Однако это требует дополнительных испытаний, поэтому, пожалуйста, возьмите этот абзац с солью.