$ facebook- ›getLogoutUrl (); ссылка не выводит пользователя из фейсбука

Моя текущая пользовательская история заключается в том, что user1 вошел на мой веб-сайт и в facebook (эти учетные записи связаны и т. Д.).

User1 выходит из моего сайта, но не выходит из facebook.

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

Поэтому, чтобы исправить это, я проверил, действительно ли пользователь, который вошел в систему, владеет текущим авторизованным в facebook (это приведет к тому, что они выйдут из facebook и т. Д.), И он показывает ссылку, которая должна позволить пользователю выйти из системы .. .

При переходе по ссылке они переходят на facebook и возвращаются на сайт. Но если вы откроете новую вкладку и перейдете в facebook, User1 все равно будет авторизован.

Как заставить работать эту ссылку .. что творится. Это баг с api что ли? ...

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


person Brandon Martinez    schedule 06.10.2011    source источник
comment
›После этого user2 входит в свою учетную запись, но оставшаяся сессия от user1 привязывает к взаимодействию пользователя user2 с моим сайтом и к тому, под кем они публикуют сообщения. Пользователь user2 входит в систему на том же компьютере / в браузере, или как «сеансы» путаются? Не могли бы вы подробнее рассказать об этом, что именно вы подразумеваете под «сессией»?   -  person CBroe    schedule 31.05.2012
comment
Да, тот же браузер. Это маловероятный сценарий, потому что люди, скорее всего, выйдут из своей учетной записи facebook, когда все равно оставят свой компьютер, но проблема все еще требует решения. В основном, если facebook вошел в систему как Человек 1, но на моем веб-сайте человек 2 входит в систему, в то время как человек 1 все еще находится в facebook, любые действия, предпринятые на моем веб-сайте лицом 2, подтягивают информацию facebook для человека 1. Я могу определить, в настоящее время вошедший в учетную запись facebook и вошедший в систему пользователь на моем веб-сайте - это одно и то же, но если нет, мне нужен способ сначала вывести человека 1 из facebook   -  person Tom    schedule 31.05.2012
comment
.... так что я могу перенаправить человека 2 на экран аутентификации facebook   -  person Tom    schedule 31.05.2012
comment
Я создал короткий тестовый пример, отображающий ссылку для входа или выхода в зависимости от того, дает ли Facebook- ›getUser мне идентификатор пользователя или нет, и, тестируя в Firefox 12, я получаю ожидаемое поведение: использование ссылки выхода из системы выводит меня из системы. Facebook - кроме небольшого сбоя, который после перенаправления на мой сайт все еще показывает ссылку logout. Мне нужно обновить страницу, прежде чем я снова увижу ссылку login; Я предполагаю, что это связано с какой-то проблемой с распознаванием браузером файла cookie, установленного Facebook перед перенаправлением на мою страницу (файлы cookie и перенаправления часто оказываются немного сложными в разных браузерах).   -  person CBroe    schedule 31.05.2012
comment
Хм, наш сценарий кажется таким же. Как вы думаете, будет ли разница, если пользователь, вошедший в facebook (которому нужно выйти), не подключен к моему приложению? (они не использовали его раньше, не принимали разрешения или что-то еще, они просто обычный пользователь facebook)   -  person Tom    schedule 31.05.2012
comment
Еще немного информации. Я заметил, что для ссылки, сгенерированной getLogoutUrl (), требуется токен доступа, который будет для пользователя, вошедшего на мой сайт, а НЕ для пользователя, вошедшего в facebook.   -  person Tom    schedule 31.05.2012
comment
[Том, я добавляю ответ вместо комментариев, потому что хочу иметь возможность правильно цитировать.] ›Как вы думаете, будет ли разница, если пользователь, вошедший в facebook (которому нужно выйти), не подключен к моему приложение? Это вообще возможно? Когда я вхожу в систему, и я не подключен к приложению, сразу после входа в FB он представляет мне диалоговое окно, которое сообщает мне, какие разрешения будет предоставлено этому приложению и т. Д., И просит меня принять. ›Я заметил, что для ссылки, сгенерированной getLogoutUrl (), требуется токен доступа. Имеет смысл - в противном случае я мог бы разместить такой URL-адрес на любой странице, например   -  person CBroe    schedule 31.05.2012
comment
Когда пользователь входит на мой сайт, он извлекает свой токен доступа из базы данных с датой истечения срока действия и проверяет, действителен ли он, а затем выполняет процесс повторной аутентификации, если срок его действия истек. Если они войдут на мой веб-сайт, тогда да, он обнаружит зарегистрированного пользователя facebook и представит диалоговое окно разрешений и т. Д. Но тогда у пользователя есть возможность связать свою учетную запись на моем веб-сайте с другой учетной записью facebook; Я хотел удалить эту возможность, определив, является ли идентификатор facebook правильным, и, если не вывести другого пользователя из рекламы facebook, представьте им экран входа в систему   -  person Tom    schedule 31.05.2012


Ответы (3)


Немного поздно, но вот мой вклад:

Используйте параметры при создании URL-адреса выхода из системы, там выполняется перенаправление на страницу, на которой вы уничтожаете сеанс, используя для этого функцию API Facebook.

Вот пример:

$logoutUrl = $facebook->getLogoutUrl(array("next" => "http://mydomain.com/page4logout"));

В page4logout вы можете создать экземпляр объекта facebook и выполнить следующее:

$facebook->destroySession();

После этого вы можете сделать перенаправление.

person Luis Fernando Villegas    schedule 22.11.2012
comment
Я сделал то, что вы предложили, но не на другой странице. $ Facebook- ›destroySession (); должно произойти на той же странице, где находится массив $ facebook = new Facebook ((.. is. Поэтому я перенаправляю на ту же страницу с параметром? logout = 1, а затем проверяю его на странице после $ facebook = new Facebook ( массив (и он работает. - person themhz; 07.04.2013
comment
@themis, почему бы не принять этот ответ? Или, если какой-либо другой способ решит вашу проблему, просто укажите свое согласие. Я просто думаю, что это правильно. Спасибо. - person Stephen Adelakun; 12.10.2015

удалить cookie и сеанс facebook вручную. Вот мое решение, как я решил проблему некоторое время назад, я думаю, что это ошибка Facebook:

setcookie('fbs_'.$this->getAppId(), '', time()-100, '/', $_SERVER["SERVER_NAME"]);
unset($_SESSION['fb_'.$this->getAppId().'_code']);
unset($_SESSION['fb_'.$this->getAppId().'_access_token']);
unset($_SESSION['fb_'.$this->getAppId().'_user_id']);
unset($_SESSION['fb_'.$this->getAppId().'_state']);

$ this-> getAppID - это ваш идентификатор приложения Facebook, должно быть ясно; o)

person Tobias Bambullis    schedule 31.05.2012
comment
будет ли это работать, если пользователь, вошедший в facebook, не подключен к моему приложению? - person Tom; 31.05.2012
comment
если пользователь не подключен к вашему приложению, как он может войти в систему на вашей странице? Я не знаю, возможно ли это ... но: пользователь окончательно выходит из системы после того, как вы это сделаете. (вы должны сделать это, когда Facebook перенаправляет на вашу страницу ...) - person Tobias Bambullis; 31.05.2012
comment
если Человек 1 входит в facebook и покидает компьютер, но facebook все еще находится в системе. Затем user2 заходит на мой сайт. Поскольку другой пользователь все еще вошел в систему, он представляет диалоговое окно разрешений с просьбой связать учетные записи вместе, что означает, что новый пользователь может связать свою учетную запись на моем веб-сайте с чужой учетной записью facebook. Я хотел избежать этого, и если учетная запись facebook не та, к которой пользователь подключался ранее, я не должен позволять им связывать ее, вместо этого выходить из системы, требуя от них входа в правильную учетную запись facebook. - person Tom; 31.05.2012
comment
user1 выполняет выход на вашей странице? Если да: вы также можете уничтожить сеанс facebook в это время. После этого у user2 проблем нет ... - person Tobias Bambullis; 31.05.2012
comment
Пользователь 1 может не использовать мой веб-сайт, он обычно находится на facebook. В основном, если кто-то на моем веб-сайте ранее подключался к facebook, я не хочу, чтобы эта опция даже казалась способной связать его с этой случайной учетной записью facebook, которая была оставлена ​​в системе. Я хочу иметь возможность определить, что эта учетная запись facebook не та, с которой человек изначально был связан на моем веб-сайте, поэтому он выходит из facebook и просит их снова войти в систему. - person Tom; 31.05.2012
comment
Ладно. Если я вас правильно понял: вы хотите выйти из системы пользователя, который в данный момент подключен к facebook. После этого новый пользователь, который использует вход в facebook на вашей странице, должен повторно войти. Мое предложение следующее: прежде чем пользователь использует ваш URL-адрес для входа в facebook, просто выполните сценарий в моем ответе. Думаю, это сработает, потому что я каждый раз выходил из системы на Facebook после того, как вызывал свой метод выхода на своей странице; o) - person Tobias Bambullis; 31.05.2012

Один из способов проверить это - использовать вместе PHP SDK и JavaScript SDK.

Когда пользователь посещает ваш сайт, вызовите FB.getLoginStatus () и убедитесь, что authResponse.userID соответствует тому, что PHP SDK возвращает в $facebook->getUser(); (вы можете сделать это с помощью вызова AJAX, если это поможет).

Вы знаете, что если идентификатор пользователя не совпадает, значит, здесь что-то не так. Вызов $ facebook-> getLogoutUrl () должен вывести пользователя как из вашего сайта, так и из facebook, но если этого не произошло, попробуйте использовать session_destroy() в своем коде, чтобы очистить сеансы. Затем перенаправьте пользователя обратно в $ facebook-> getLoginUrl () и заставьте его снова войти в систему. Это исправит несоответствие в идентификаторе пользователя, и вы сможете повторить процесс, когда они вернутся на ваш сайт.

Я видел, как это происходило в других приложениях, что наводит меня на мысль, что это проблема facebook. Кажется, что SDK JavaScript не проверяет, действителен ли файл cookie (если он уже существует).

person Niraj Shah    schedule 01.06.2012