Получить токен доступа из Facebook PHP SDK не работает должным образом

Я пытаюсь получить токен доступа из Facebook с помощью PHP SDK 3.2.2, который является кодом ниже того, что я разместил в URL-адресе перенаправления после успешного входа пользователя в Facebook. Моя проблема в том, что $this->facebook->getAccessToken() не возвращает токен доступа пользователя после того, как пользователь предоставляет доступ к приложению, а просто строку в форме: 'AppId|AppSecret' , и я должен включить код, чтобы вручную получить токен доступа пользователя. Это работает, но я не знаю, ПОЧЕМУ, когда я использую getAccessToken, я не возвращаю правильный токен. Я также хотел бы знать, есть ли лучший способ получить токен доступа пользователя, чем с помощью $code, потому что я не думаю, что это хороший способ сделать это.

ПРИМЕЧАНИЕ. Я использую $this->facebook, поскольку загружаю его как библиотеку Codeigniter.

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

  //-------------------------------------------------------------------------
  //echo '<br/>Access Token: ' . $access_token;
  // Generare Token if not created:
  $code = $_REQUEST["code"];

  if ( isset($code) ) {
     //echo '<br/>Code Enviado: ' . $code;
     //exit();
     $appId     = $this->facebook->getAppId();
     $appSecret = $this->facebook->getAppSecret();

     $redirectTo = base_url('asociar/acc_facebook/step2/');

     $token_url="https://graph.facebook.com/oauth/access_token?client_id="
        . $appId . "&redirect_uri=" . urlencode($redirectTo)
        . "&client_secret=" . $appSecret
        . "&code=" . $code . "&display=popup";
     $response = file_get_contents($token_url);
     $params = null;
     parse_str($response, $params);
     $access_token = $params['access_token'];

     //echo '<br/>Repitiendo el Token';

     $this->facebook->setAccessToken($access_token);
     //echo '<br/>Second Access Token Fijado: ' . $access_token;
  }
  //-----------------------------------------------------------------------

ОБНОВИТЬ:

Эта проблема связана с тем, что я использовал CI с PHP SDK (проверьте мой собственный ответ), но ответ действителен для всех, у кого есть эта проблема с Facebook PHP SDK (проверьте ответ @Imbru)


person Federico J.    schedule 12.02.2013    source источник


Ответы (2)


Ответ немного запоздал, но может быть он поможет другим пользователям.

У меня такая же проблема сегодня.

Мой access_token неправильно хранился в $_SESSION. По-видимому, клиентская сторона отправляет только один раз access_token. Вы должны сохранить его в памяти (SESSION) и использовать повторно.

В обычное время Facebook PHP SDK делает это...

РЕДАКТИРОВАТЬ: См. Ответ @Chococroc для получения дополнительных объяснений.

person Kevin ABRIOUX    schedule 13.06.2014
comment
Привет! Я пометил ваш ответ как принятый, потому что, хотя я его не проверял, я почти уверен, что вы правы. Codeigniter НЕ ИСПОЛЬЗУЕТ СОБСТВЕННЫЕ СЕССИИ PHP, он отправляет все данные в файл cookie, поэтому, когда Facebook SDK пытается сохранить в SESSION значение токена, он не может. - person Federico J.; 15.06.2014

@Imbru указал на меня в решении, если есть заслуга, отдайте ему.

Учтите это: при использовании Codeigniter он сохраняет все данные сеанса в куки и отправляет их в браузер, а не сохраняет на сервере. Да, они это делают, и это приводит ко многим другим проблемам (например, потеря сессии, когда вы храните много данных, а браузер отправляет вам только часть из них, но это уже другая история).

С CI решение состоит в том, чтобы перезаписать основной класс сеанса другим классом сеанса, который управляет сеансом с помощью PHP $_SESSION, например, https://bitbucket.org/xperez/core-session-storage-for-codeigniter (я использую его в своих проектах и ​​отлично работаю). Таким образом, при использовании PHP-sdk вы сохраните значения в сеансе, и когда класс Facebook попытается получить их обратно, он сможет это сделать.

И, конечно же, если у вас возникли проблемы с Facebook PHP SDK, проверьте, хранит ли $_SESSION нужные вам значения, так как проблема в том, что у вас нет значения на сервере, когда вы хотите его получить, что приводит к к ошибке не аутентификации.

person Federico J.    schedule 15.06.2014