2013-12-19 1 views
5

У меня есть эта функция для FacebookFacebook маркер в связи с сессией

public function link2(){ 
     global $config; 
     $facebook = new Facebook(array(
       'appId' => $config['facebook_appId'], 
       'secret' => $config['facebook_secret'], 
       'cookie' => true 
     )); 
     return $facebook; 
    } 

тогда я делаю это, чтобы получить маркер

if(isset($_SESSION['fb_'.$config['facebook_appId'].'_access_token'])){ 
      $accesstoken = $_SESSION['fb_'.$config['facebook_appId'].'_access_token']; 
     }else{ 
      $accesstoken = $facebook->getAccessToken(); 
     } 

и хранить его в БД, но после того, как я выйти из системы и войдите снова и сделать еще один вызов для ALBUMS я получаю ошибку

A user access token is required to request this resource 

я делаю session_destroy в моем файле logout.php я интересно, как с этим связано сеанс. Если я изменю свой файл logout.php, чтобы просто отключить переменную userId, тогда вызов будет работать для меня. Я что-то упустил?

+0

Можете ли вы подтвердить токен, сохраненный в базе данных? И как вы устанавливаете токен доступа для объекта Facebook? Немного больше вашего кода может помочь вам получить ответ. –

+0

@m_poorUser да, он сохраняется в DB, ​​«как вы устанавливаете токен доступа на объект Facebook? Я этого не делаю, не знаю, что это такое –

+0

Я имел в виду, как вы используете токен доступа, который вы сохранили в базе данных после выхода из системы и войдите в систему снова? –

ответ

1

Зачем хранить токен доступа пользователя во время сеанса? Весь смысл данных сеанса - временное хранилище.

Вы можете просто сохранить маркер в базу данных во время входа и читать его оттуда каждый раз, когда вы называете $facebook = new Facebook(...

Это будет гораздо проще, если вы храните его только в одном месте.

Во-вторых, вы не можете ожидать, что пользователь использует кнопку выхода из системы. Если пользователь просто закрывает браузер и убивает свои файлы cookie, сеанс не будет уничтожен, но никто не сможет его получить. Итак, единственное, что нужно сделать, это уничтожить сеанс.

2

Просто выполните следующие действия. вам может потребоваться получить токен доступа к Интернету.

1. Вы будете иметь App Name, App URL, идентификатор приложения и App Secret получить код доступа, перейдите по ссылке:

https://www.facebook.com/dialog/oauth?client_id=Your_App_ID&redirect_uri=Your_App_URL&scope=read_stream,publish_stream,offline_access

после нажатия кнопки; Ваш браузер будет перенаправлять на Your_App_URL с дополнительным атрибутом URL, он будет выглядеть примерно так:

Your_App_URL код = long_facebook_code

2. получить автономный маркер доступа, перейдите к:

https://graph.facebook.com/oauth/access_token?client_id=Your_App_ID&redirect_uri=Your_App_URL&client_secret=Your_App_Secret&code=long_facebook_code

страница будет отображать что-то вроде

access_token = 123456789 | 99bdea74e40ecc75530b7c45-132456798 | dTntC8lVyR84eBxK1TS9ws2s_s0

Примечание: убедитесь, что в конце токена (жирный текст) нет слова «expire =», чтобы скопировать ваш токен (только жирным шрифтом) и использовать его, постоянный токен и никогда не изменять событие, если вы измените название своей заявки.

+0

Я не могу понять, что с учетом моего вопроса и кода –

0
//Check and retrieve access token if exists for current user 
$atfromdb = mysql_query("......"); 

if(isset($_SESSION['fb_'.$config['facebook_appId'].'_access_token'])){ 
    $accesstoken = $_SESSION['fb_'.$config['facebook_appId'].'_access_token']; 
}else if(strlen($atfromdb) > 0){ 
    $accesstoken = $atfromdb; 
}else{ 
    $accesstoken = $facebook->getAccessToken(); 
} 
0
if(isset($_SESSION['fb_'.$config['facebook_appId'].'_access_token'])){ 
    $accesstoken = $_SESSION['fb_'.$config['facebook_appId'].'_access_token']; 
}else{ 
    $accesstoken = $facebook->getAccessToken(); 
} 

Если это единственный код, который вы должны назначить $accesstoken, то $accesstoken будет определено после выхода из. session_destory() удаляет все ключи, хранящиеся в $_SESSION. Таким образом, isset() вернет false.Затем $facebook->getAccessToken() проверяет только, существует ли токен в качестве параметра строки запроса; поскольку токен не отправляется (он отправляется только после перенаправления с Facebook), поэтому $accesstoken не определен.

Быстрое исправление заключается в том, чтобы установить сеансовый ключ, как он существовал ранее. Непосредственно после кода аутентификации установите ключ сеанса, используя данные пользователя из своей базы данных. Такие как:

$_SESSION['fb_'.$config['facebook_appId'].'_access_token'] = $user_from_database['his_stored_access_token']; 
Смежные вопросы