it-swarm.com.ru

FB.getLoginStatus возвращает статус неизвестно

При вызове FB.getLoginStatus с использованием действующего приложения Facebook статус ответа всегда неизвестен. Точный ответ: {authResponse: undefined, status: "unknown"}.

<html>
<body>
    <div id="fb-root"></div>

    <script>
    window.fbAsyncInit = function(){
        FB.init({ appId:'1484134468466778', status:true,  cookie:true, xfbml:true});
        FB.getLoginStatus(function(response){
        console.log(response);
        });
    };

    (function(d){
        var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";
        d.getElementsByTagName('head')[0].appendChild(js);
    }(document));
    </script>
</body>
</html>


Пример URL: http://media.tuentifotos.com/simple_test.html


Вот скриншот настроек приложения Facebook .Facebook App Settings

15
Diego Cerdan Puyol

Это происходило для меня в Chrome, потому что Chrome был настроен для блокировки сторонних файлов cookie и данных.

После внесения изменений в конфигурацию FaceBook может без проблем войти в мое приложение.

  • Настройки Chrome
  • Показать дополнительные настройки...
  • Конфиденциальность
  • Настройки контента...
  • снять галочку Блокировать сторонние куки и данные сайта
16
Flimzy

Когда я проверял, статус показывает "not_authorized", и это нормально, так как я еще не авторизовал приложение.

Чтобы завершить процесс, вы должны добавить FB.login всякий раз, когда идентификатор пользователя не авторизован или не вошел в Facebook:

window.fbAsyncInit = function(){
    FB.init({ appId:'{APP-ID}', status:true,  cookie:true, xfbml:true});
    FB.getLoginStatus(function(response){
        if (response.status === 'connected') {
           //proceed
        } else if (response.status === 'not_authorized') {
           login();
        } else {
          login();
        }
    });
};

function login(){
   FB.login(function(response) {
      if (response.authResponse) {
         // proceed
      } else {
         // not auth / cancelled the login!
      }
   });
}
3
Sahil Mittal

Для меня это означало «на моей странице входа», мне нужно было указать куки.

  window.fbAsyncInit = function() {
   FB.init({
      version: 'v2.8',
      cookie     : true,
    });
  };

Но не спрашивайте меня почему это было так. Он также исправил необходимость дважды щелкнуть по кнопке входа в систему, чтобы фактически войти в систему, и даже не требует appId, по-видимому, FWIW ...

3
rogerdpack

Я тоже сталкивался с этой проблемой в Chrome. Однако в Firefox он работал, как и ожидалось, с состоянием, возвращаемым как connected, когда пользователь вошел в систему ранее.

Я нашел подсказку об этом из ответа на аналогичный вопрос здесь .

Основной причиной этой проблемы является то, что в FB.logout() Chrome не удаляет cookie fblo_<your-app-id>, который каким-то образом влияет на функцию FB.getLoginStatus(), возвращающую unknown

Исправлено: при вызове FB.logout() вы можете программно удалить cookie fblo_<your-app-id>

FB.logout(function(response) {
  deleteCookie("fblo_" + fbAppId); // fblo_yourFBAppId. example: fblo_444499089231295
});

function deleteCookie(name) {
  document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
}
3
Nagesh Andani

У меня была такая же проблема, я исправил это, очистив весь кеш и куки.

0
divyanshu

У меня была такая же проблема в IE. Ответ Флимзи заставил меня задуматься. Я попытался запустить IE от имени администратора, и это сработало.

0
Dennis Calla

Окончательный ответ

Итак, я думаю, что наконец-то понял эту чертову проблему.

Что тебе нужно знать:

1) Вы авторизуетесь через Facebook через идентификатор приложения. Это устанавливает различные куки, где идентификатор вашего приложения помечается в конце:

  • fblo_000000000000
  • fbm_000000000000
  • fbsr_000000000000

2) Если вы удалите эти файлы cookie, вы все равно будете аутентифицированы на Facebook как обычный пользователь (если вы не выйдете из системы полностью). И на серверах Facebook они до сих пор знают, что вы авторизованы в этом приложении.

  • Поэтому, когда вы снова запустите FB.getLoginStatus(), он просто создаст их заново и вернет обратно. Это не то, что ожидает ваш пользователь. Это плохо. Они нажали «Выйти».

3) Документы явно говорят это :

Пользователь либо не вошел в Facebook, либо явно вышел из вашего приложения, поэтому он не пытается подключиться к Facebook и, следовательно, мы не знаем, аутентифицировали ли они ваше приложение или нет. (Неизвестно)

Поэтому они даже не пытаются проверить, установлен ли этот файл cookie. Вот почему вы получаете нулевой или неопределенный. Таким образом, файл cookie fblo считается отключенным. Вы НЕ НАСТОЯЩИМ ИЗБИРАЛИСЬ из-за того, что любой обычный человек посчитал бы выходом из системы, чтобы иметь в виду. Там просто печенье говорит, что вы есть! Конечно, если пользователь снова войдет в систему с помощью кнопки входа в систему, то cookie будет удален, что и вы, и ваш пользователь хотят.

Поэтому я считаю, что единственное, что имеет смысл делать (если вам действительно нужно знать статус пользователя), это:

  • Перед запуском fblo_<APPID> вручную проверьте наличие FB.getLoginStatus cookie.
  • Если cookie не существует, ничего не делайте и запускайте свой обычный поток.
  • Если cookie существует, у вас есть несколько вариантов:

1) Вариант 1

Делать абсолютно нечего. Теперь вы понимаете проблему, понимаете, что не нужно удалять cookie, и, возможно, вам не нужно ничего делать, кроме как показать кнопку входа в Facebook. 

2) Вариант 2 

Вы предполагаете, что пользователь является пользователем вашего приложения, и делаете все, что вам нужно, чтобы показать пользовательский интерфейс. Но вы не будете использовать свою полную нормальную логику - это будет приложение, специфичное для вас.

3) Вариант 3 

  • Вручную установите значение cookie fblo_<APPID> на n (вместо 'y'). Помните, что этот cookie установлен на вашем домене, поэтому вы можете изменить его. * В зависимости от вашей среды разработки это будет варьироваться, но это нужно делать на стороне клиента, и вам может потребоваться указать путь к `/ 'и вашему домену cookie).
  • Запустите функцию getLoginStatus(..., true) - теперь она не будет заблокирована, поскольку файл cookie теперь n. Однако вы здесь не должны использовать свою обычную логику - потому что все, что вы хотите сделать, это проверить, является ли пользователь на самом деле пользователем Facebook и/или все еще аутентифицирован в вашем приложении. 
  • Вручную установите значение cookie обратно на y

К сожалению, я не могу рекомендовать это решение из-за странных условий гонки. Это почти почти работает, но FB может преднамеренно или случайно сломать его в любое время - и это на самом деле заканчивается тем, что он все еще смущен, думая, что вы действительно вошли в систему, когда вы этого не сделали. Кроме того, это может иметь все виды осложнений с другими плагинами, которые я даже не наблюдал.

Я бы хотел, чтобы getLoginStatus всегда работал и давал точную информацию, но это единственное верное решение, которое я вижу. И так было 8 лет, поэтому я думаю, что мы застряли с этим.

4) Вариант 4 - установить свой собственный файл cookie

  • У вас всегда есть возможность установить свои собственные куки-файлы для указания определенных вещей, таких как «этот пользователь в какой-то момент вошел в Facebook» или «этот пользователь аутентифицирован в моем приложении». Но я осторожен в этом, потому что это может быстро усложниться.

Между прочим, я вновь обратился к этой проблеме, потому что я использую плагин Messenger для своего веб-сайта, и я не хочу, чтобы он отображался вообще, если я не знаю, что у человека есть учетная запись Facebook. Поэтому мне нужен точный ответ на статус входа.

0
Simon_Weaver