Я работаю в приложении, которое использует соединение facebook для входа в систему пользователей, используя свою учетную запись facebook.
Все работает отлично, за исключением следующего случая:
В этом случае открывается всплывающее окно facebook connect, в котором говорится «Ошибка в приложении».
Я обнаружил, что причина в том, что старый файл cookie fbs не удаляется при выходе пользователей. Я добавил код для удаления cookie при выходе из моего приложения, но cookie не удаляется.
Вот мой код (с использованием платформы Symfony).
$fbCookie = 'fbs_'.sfConfig::get('app_facebook_application_id'); $cookie = $request->getCookie($fbCookie); if(!is_null($cookie)){ setCookie($fbCookie," ", time()-3600); }
Это не работает. Файл cookie остается тем же. Функция setCookie возвращает «1», как ожидалось.
В чем проблема?
Я уверен, что у меня тоже были проблемы с этим … вам нужно убедиться, что вы убьете сессию Facebook сразу после удаления файла cookie, иначе он просто появится снова … вот пример
// Assuming that $facebook is your facebook object populated with your settings $facebook = new Facebook(array( 'appId' => FB_APPID, 'secret' => FB_APPSECRET, 'cookie' => true)); $fb_key = 'fbs_'.sfConfig::get('app_facebook_application_id'); set_cookie($fb_key, '', '', '', '/', ''); $facebook->setSession(NULL);
В текущей версии SDK для Facebook вам необходимо использовать
$fb_key = 'fbsr_'.$facebookConfig['app_id']; setcookie($fb_key, '', time()-3600); $facebook->destroySession();
Я попытался очистить файлы cookie и сеанс вручную, и по какой-то причине он по-прежнему не работает (см. Facebook PHP: после выхода пользователя из системы facebook они не могут войти в мое приложение с другим пользователем ). Использование вышеуказанного решения было тем, что работало в конце.
У меня была такая же проблема, и ни одно из решений, которые я придумал в Интернете, не работало для меня. Затем неожиданно другое приложение с тем же кодом работало нормально, поэтому я проверил расширенные настройки в приложении, и он работал, когда я изменил: OAuth 2.0 для Canvas ENABLED, без учета часовых поясов. ENABLED и Upgrade to Requests 2.0 ENABLED
Надеюсь, поможет
Обязательно используйте следующий код:
$params = array( 'next' => 'https://yourUrl/logout' ); $data['logoutUrl'] = $this->facebook->getLogoutUrl($params);
перенаправить страницу на контроллер выхода или страницу, а затем убить сеансы на этой странице.
Как вы сказали;) это о cookie, который задает ваш местный скрипт, а не на сайте Facebook.com, поэтому ваш вопрос является законным.
Здесь я сталкиваюсь с той же проблемой. PHPSDK не дает вам возможности удалить файл cookie. Таким образом, либо вам нужно запустить весь сеанс без cookie:
$facebook = new Facebook(array( 'appId' => FB_APPID, 'secret' => FB_APPSECRET, 'cookie' => false, ));
или вы перенаправляете пользователя на URL выхода в facebook:
header('Location: ' . $facebook->getLogoutUrl(array('next'=>URL_AFTER_LOGOUT))');
Единственная проблема заключается в том, что пользователь выходит из Facebook тоже.
Если вы можете использовать Javascript, попробуйте:
<script src="http://connect.facebook.net/en_US/all.js"></script> <script> FB.init({appId: '<?php echo FB_APPID;?>', status: true, cookie: true, xfbml: true}); FB.Event.subscribe('auth.logout', function(response) { window.location.href='YOUR_LOCAL_LOGOUTSCRIPT'; }); </script>
У меня тоже были проблемы с этим, и вопреки ответу Эфазати моя проблема заключалась в том, что файлы cookie, установленные в моем собственном домене, были в библиотеке php api Facebook. То, что я забыл, это удаление файла cookie с использованием точной области и пути, с которым был установлен файл cookie. Это строка, которая успешно удалила cookie для меня.
setcookie("fbs_" . $app_id, '', time()-3600, "/", ".mydomain.com");
Комментарий tgriesser также был полезен.
<?php // include the Facebook SDK include_once 'src/facebook.php'; // Define crutial perams define( 'APPID', '' ); define( 'SECRET', '' ); define( 'URL', 'http://fb.domain.co.uk' ); // shake my hand! $facebook = new Facebook( array( 'appId' => APPID, 'secret' => SECRET, 'fileUpload' => true ) ); // if we are being visited by someone trying to logout, lets me sure they get logged out! if( isset( $_GET['logged_out'] ) ) { setcookie( "PHPSESSID", "", (time()-3600) ); header( "location: " . URL ); exit(); } // lets try to get the users id $user_id = $facebook->getUser(); // try to get their access token $access_token = $facebook->getAccessToken(); // if we have an id if($user_id) { // from the offset, we're good to go... $logged_in = true; echo "<h1>Logged in</h1>"; $params = array( 'next' => URL . '?logged_out' ); $return .= '<br /><a href="' . $facebook->getLogoutUrl($params) . '">logout</a>'; }else{ // login man! $login_url = $facebook->getLoginUrl( array( 'scope' => 'read_stream, publish_stream, manage_pages, photo_upload', 'next' => URL . '?logged_in' ) ); $return .= 'Please <a href="' . $login_url . '">login.</a>'; } echo $return ?>
У меня была такая же проблема, и я пробовал все вышеперечисленное, но потом я подозревал, что имена файлов cookie не то, что я ожидаю от них, и действительно! Поэтому я просто распечатал свои файлы cookie и тщательно проверял, какие из них я хочу удалить:
//print the cookies just to make sure what is the exact name of the cookie foreach ($_COOKIE as $key => $value) { print $key . "=" . $value . "</br>"; } //delete if (isset($_COOKIE['fbsr_' . $app_id])) { setcookie('fbsr_' . $app_id, $_COOKIE['fbsr_' . $app_id], time() - 3600, "/"); setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() - 3600, "/"); unset($_COOKIE['fbsr_' . $app_id]); unset($_COOKIE['PHPSESSID']); }
с//print the cookies just to make sure what is the exact name of the cookie foreach ($_COOKIE as $key => $value) { print $key . "=" . $value . "</br>"; } //delete if (isset($_COOKIE['fbsr_' . $app_id])) { setcookie('fbsr_' . $app_id, $_COOKIE['fbsr_' . $app_id], time() - 3600, "/"); setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() - 3600, "/"); unset($_COOKIE['fbsr_' . $app_id]); unset($_COOKIE['PHPSESSID']); }
Этот скрипт php должен запускаться после вызова в FB.logout
в вашей части js:
function logout() { FB.init({appId: '[your app id]', status: true, cookie: true,xfbml: true}); var flag = confirm("logout from your facebook account as well"); if (flag) { FB.logout(function(response) { window.location='logout.php' }); } }
По какой-то причине вы не можете удалить файл cookie, хотя у вас, очевидно, есть разрешение на его чтение (потому что вам нужно было прочитать access_token).
Но так или иначе: эта проблема возникает только на локальном хосте. На вашем сервере вы не должны столкнуться с проблемой! Куки-файл также не удаляется на вашем сервере, но он не распознается как действительный access_token, когда вы снова пытаетесь войти в систему.