Как расширить маркер доступа пользователя Facebook с помощью PHP SDK?


У меня есть такой код:

$facebook->api("/oauth/access_token?grant_type=fb_exchange_token&client_id=".$facebook->getAppId()."&client_secret=".$facebook->getAppSecret()."&fb_exchange_token=".$user->getFacebookAccessToken());

Он не создает никаких исключений, но возвращает значение null. Я пытаюсь продлить кратковременный доступ к Facebook маркер пользователя, чтобы быть долгожителем Facebook маркер доступа пользователя. Однако после того, как я сгенерировал новый токен и вызвал этот запрос, пока новый токен был еще жив, я подождал несколько часов и запустил браузер, в котором я не был зарегистрирован с помощью своей учетной записи facebook. Затем я вошел в систему с тестовым Пользователем (в приложение, а не в Facebook), но Facebook, к сожалению, направлял меня в Facebook login, а это значит, что маркер доступа пользователя Facebook был каким-то образом недействителен.

Я работал на основе документа, найденного здесь.

Итак, может кто-нибудь просветить меня, как я должен отправить запрос, чтобы Facebook действительно продлил жизненный цикл токена? Кроме того, я не уверен, как я могу определить, успешно ли я продлил жизненный цикл маркера доступа пользователя Facebook. (Я не фанат Facebook, мягко говоря, и я я тоже новичок в API Facebook).

Спасибо, ребята.

Править: Я прочитал эту статью и скопировал метод setExtendedAccessToken в свой класс с несколькими модификациями для поддержки моей логики. Теперь код, который пытается продлить жизненный цикл пользователя Facebook Access Token выглядит следующим образом:

$facebook->setExtendedAccessToken($user->getFacebookAccessToken());

Теперь он возвращает массив из двух элементов, токена и даты истечения срока действия. Срок годности - "5174078". Я считаю, что я на правильном пути, чтобы решить эту проблему, am Я?

2 3

2 ответа:

Вот что, я думаю, вы должны делать:

  1. пользователь FB, вошедший в систему, приходит на ваш сайт, и вы получаете для него недолговечный токен через поток на стороне клиента в JavaScript SDK или долгоживущий токен через поток на стороне сервера с PHP или каким-либо другим SDK (похоже, вы уже делаете первый из них)
  2. Если это был недолговечный токен, расширьте его и получите долгоживущий токен с помощью вызова API для обмена токеном (похоже, вы делаете это тоже)
  3. сохраните долгоживущий токен в свою базу данных (не уверен, что вы это делаете)
  4. Если Facebook не вошел в систему, вы используете кэшированный токен из базы данных в ->setAccessToken (), а затем выполняете вызовы API Facebook от его имени.
  5. Когда пользователь возвращается в ваше приложение в какой-то другой момент, входите в приложение через вашу собственную систему входа, но не входите в Facebook.]}

Я думаю, что Шаг 4-это ваша проблема; я подозреваю, что вы видите, что пользователь вышел из Facebook и отправляет их через процесс авторизации Facebook снова вместо того, чтобы они вошли в ваше приложение через ваш собственный механизм входа и повторно использовали маркер, который вы хранили раньше.

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

Просто к вашему сведению, потому что я спотыкался с маркером доступа в течение последних 45 минут. Через документацию facebook: https://developers.facebook.com/docs/roadmap/completed-changes/offline-access-removal/

Который, кажется, немного устарел, я смог вручную расширить свой существующий токен недолговечного доступа с помощью: https://graph.facebook.com/oauth/access_token ?
client_id=APP_ID& client_secret=APP_SECRET& grant_type=fb_exchange_token& fb_exchange_token=EXISTING_ACCESS_TOKEN