Я пытаюсь получить расширенный долгоживущий токен доступа с помощью
$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 *
setExtendedAccessToken();
вернет тот же самый расширенный токен доступа, который вы получили ранее. Этот токен по-прежнему может запрашивать информацию пользователя. Таким образом, это похоже на ошибку в Facebook, насколько мне не нравится это говорить. Мы можем обойти это с помощью взлома, который я подробно описал выше, и любые последующие вызовы для получения токена доступа будут просто возвращать токен с краткосрочным доступом, который можно обменять снова и снова для одного и того же токена доступа.
Оригинальный ответ
Согласно этому ответу , новый токен доступа сохраняется в постоянных данных (как вы указали и в своем вопросе), и к ним можно получить доступ через $facebook->getAccessToken();
,
Две важные примечания:
$facebook->getAccessToken();
, вы просто получаете тот же знак назад, но его срок действия изменился? Из документации в Facebook:
Когда пользователь посещает ваш сайт с помощью существующего, действительного, недолгого пользователя access_token, у вас есть возможность продлить срок действия этого токена доступа. Наша платформа будет продлевать срок действия только один раз в день , поэтому, даже если пользователь повторно просматривает ваш сайт несколько раз в день, токен будет продлен в первый раз. (акцент мой)
Я считаю, что это так, потому что неряшливые программисты вызовут $facebook->setExtendedAccessToken();
при каждой возможной возможности, в надежде всегда получить расширенный токен доступа. (Вместо предпочтительного поведения, которое будет вызывать только $facebook->setExtendedAccessToken();
если то, что у вас есть в настоящее время, – это токен с краткосрочным доступом, но как бы вы сказали, если вы не сохранили дату истечения срока действия, само по себе не так уж и надежно …!)
Мое предположение заключается в том, что если пользователь отменяет авторизацию приложения или токен в противном случае делает недействительным, предел будет сброшен, и вы сможете снова получить токен расширенного доступа при передаче в токене краткосрочного доступа. Однако это требует дополнительных испытаний, поэтому, пожалуйста, возьмите этот абзац с солью.