У меня есть полностью функциональный запрос FQL, но когда он запускается второй раз, я получаю код ошибки 102: требуется сеанс пользователя
В моем приложении у меня есть Autocomplete Search for Friends. Я использую jquery ui autocomplete с динамическим источником с использованием AJAX.
Это моя функция PHP:
function fb_buscarAmigosAutocomplete($term='',$app_user=false){ $facebook = new Facebook(array( 'appId' => APP_ID, 'secret'=> APP_SECRET )); $term=trim(strtolower($term)); //Buscar usuarios try{ $fql = " SELECT uid,name,first_name,last_name,pic_square FROM user WHERE uid IN ( SELECT uid2 FROM friend WHERE uid1=me() ) AND strpos(lower(name),'".$term."') >=0 "; if($app_user) $fql .= " AND is_app_user"; $fql .= " LIMIT 5"; $param = array( 'method' => 'fql.query', 'query' => $fql, 'callback' => '' ); $result = $facebook->api($param); } catch(FacebookApiException $e){ $error=$e->getMessage(); var_dump($e); } if(!empty($result)) { $return['amigos']=$result; $return['valido']=true; }else $return['valido']=false; return $return; }
Странно то, что за последние 2-3 недели это работало нормально, и внезапно это прекратилось. Даже «более странный», он все еще срабатывает при первом запуске, но не во второй раз. Поскольку это асинхронно, я не понимаю, какая разница, если это первый, второй, третий, четвертый раз, когда он запускается.
Есть идеи?
Редактировать 1 С дальнейшими исследованиями я думаю, что у меня есть обходное решение. Возможно, это связано с тем, что здесь сообщается об ошибке
Мое обходное решение состояло в том, чтобы поймать первый access_token, который я получил с объектом Facebook, а затем привязать его к каждому экземпляру класса, что-то вроде этого
Первое соединение:
$facebook = new Facebook(array( 'appId' => APP_ID, 'secret'=> APP_SECRET )); $uid = $facebook->getUser(); if($uid){ $_SESSION['access_token']=$facebook->getAccessToken(); }
Любое другое использование api:
$facebook = new Facebook(array( 'appId' => APP_ID, 'secret'=> APP_SECRET )); $facebook->setAccessToken($_SESSION['access_token']); try{ $user_info = $facebook->api('/'.$uid.'?fields=id,name,first_name,last_name,email,picture'); } catch(FacebookApiException $e){ $error = $e->getMessage(); }
Пока он решил проблему
Изменить 2
это не … иногда мой токен доступа – это действительная буквенно-цифровая +100 символов String и те времена, когда она работает.
Иногда это только 48 строк String, и это не … я действительно застрял здесь
Причина этого, скорее всего, происходит из-за 5 декабря 2012 года «Ломающиеся изменения», которые Facebook выкатил. В частности:
Новые ограничения безопасности для кодов авторизации OAuth
Мы разрешаем только обмен авторизационными кодами для доступа к токенам доступа и потребуем, чтобы их обменяли на токен доступа в течение 10 минут после их создания . Это соответствует спецификации OAuth 2.0 Spec, которая с самого начала заявила, что «коды авторизации ДОЛЖНЫ быть короткими и однократными». Для получения дополнительной информации ознакомьтесь с нашей документацией по аутентификации.
Вот почему ваш первый запрос работает, а второй – нет. Во второй попытке SDK пытается обменять ваш пользовательский код на токен доступа. Но из-за этих изменений это можно сделать только один раз. Ваш код выглядит так, как будто он работает правильно, поскольку вы явно сохраняете, а затем устанавливаете access_token
после его первого получения. Убедитесь, что это так (подтвердите, что var $ _SESSION сохраняются / извлекаются должным образом). Если по какой-то причине это не так, ошибка 102 – это то, что вы увидите.
ура