Подтвердить что ты не робот

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

При вызове FB.getLoginStatus с использованием действительного приложения Facebook статус ответа всегда неизвестен. Точный ответ: {authResponse: undefined, статус: "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

4b9b3361

Ответ 1

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

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

  • Настройки Chrome
  • Показать дополнительные настройки...
  • Приватность
  • Настройки контента...
  • снимите флажок заблокировать сторонние файлы cookie и данные сайта

Ответ 2

Я тоже столкнулся с этой проблемой в 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

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

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

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

Ответ 4

Когда я проверил, статус показывает "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!
      }
   });
}

Ответ 5

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

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

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

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

  • fblo_000000000000
  • fbm_000000000000
  • fbsr_000000000000

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

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

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

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

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

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

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

1) Вариант 1

Делать абсолютно нечего. Теперь вы понимаете проблему, понимаете, что не нужно удалять куки, и, возможно, вам не нужно ничего делать, кроме как показать кнопку входа в 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. Поэтому мне нужен точный ответ на статус входа.

Ответ 6

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

Для этого перейдите на

settings > advanced > site settings > Cookies and site data

Затем снимите флажок, запрещающий сторонним веб-сайтам сохранять и читать файлы cookie. Это не может быть хорошим вариантом, но это решает эти проблемы для меня. image

Ответ 7

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

Ответ 8

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

Ответ 9

Я прочитал документацию Facebook, и я прочитал этот пост снова и снова, и я до сих пор не понимаю, что я должен делать, чтобы преодолеть неизвестный статус. Я скопировал и вставил стандартный код инициализации в мой общий файл шаблона, что означает, что он появляется на каждой странице моего сайта. Я знаю, что код работает, потому что он находит место на моей странице, которое я зарезервировал для использования FB, и вставил значок, чтобы перейти на мою страницу в Facebook. Так почему статус входа в систему по-прежнему показывает неизвестный, а не не авторизованный? Пока я не получу несанкционированный доступ, я не могу использовать FB, чтобы помочь пользователям использовать мой сайт.

попробуйте https://www.jamescobban.net/genealogy.php

Я только начинаю, так что все, что я сделал, это скопировал пример кода. Если я не могу понять, почему этот стандартный код не работает, я вырву поддержку FB и посмотрю, не испортили ли их какие-то другие полномочия SSI.

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