Вопрос по facebook-authentication, facebook – auth.statusChange не срабатывает во время FB.init, если пользователь не вошел в Facebook

16

Я задавался вопросом, нашел ли кто-нибудь обходной путь к поведению, которое я испытываю.

Возьмите пример кода ниже:

<script>
window.fbAsyncInit = function() {
        FB.init({
          appId      : '[----removed-------]', // App ID
          channelUrl : 'http://localhost/channel.html', // Channel File
          status     : true, // check login status
          cookie     : true, // enable cookies
          xfbml      : true  // parse XFBML
        });     
        // Additional initialization code here

        FB.Event.subscribe('auth.statusChange',fbLoginStatus);

        console.log("getloginstatus");

        FB.getLoginStatus(fbLoginStatus);
</script>

Использование FB.init со статусом true, по сути, вызываетgetLoginStatus() в соответствии сдокументация в фейсбуке, Тем не менее, этоочевидно, предполагаемое поведение что это будетnot вызвать событиеauth.statusChangeпотому что значением по умолчанию является «неизвестный»,and значение для "не вошло в систему" также является «неизвестным»; (хотя это может быть известно !!)

Поэтому мне пришлось позвонитьFB.getLoginStatus() эксплицитноas well as со статусом true, если я хочу также отвечать пользователям, которые не вошли в Facebook.

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

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

странно - эта ошибка, кажется, была удалена. все это катастрофа. Я остался без понятия о том, когдаstatus:true на самом деле полезно. они говорят: «Если вы установили состояние в true в вызове FB.init (), SDK попытается получить информацию о текущем пользователе сразу после init. Это может сократить время, необходимое для проверки состояния вошедшего в систему пользователя, если вы используете Facebook Login, но бесполезно для страниц, на которых есть только социальные плагины. значит ли это, что ответ кешируется? Simon_Weaver

Ваш Ответ

3   ответа
4

которое теоретически должно спасти вас от обходов, заключается в следующем (coffeescript, но легко переводимый на javascript):

FB.init
  appId: appId
  channelUrl: channelUrl
  status: true     # Check Facebook Login status on init
  cookies: true
  xfbml: false

FB.getLoginStatus (response) =>
  @parseResponse(response)
  FB.Event.subscribe 'auth.statusChange', @parseResponse
  FB.Event.subscribe 'auth.authResponseChange', @parseResponse

Мы по-прежнему используем метод getLoginStatus для запуска, когда пользователь неизвестен, но на этот раз мы по-прежнему используем «статус: истина». так что статус входа уже кэшируется при вызове getLoginStatus. Подписываясь на соответствующие события только после запуска getLoginStatus, мы гарантируем, что метод обработки parseResponse вызывается только один раз при загрузке.

0

который вы получите после передачи истинного параметра вgetLoginStatus:

window.fbAsyncInit = function() {
    FB.init({
        appId  : '',
        status : true,
        cookie : true,
        xfbml  : true,
    });

    FB.getLoginStatus( function(response) {
        //console.log(response);
        if (response.status === 'connected') {
            var accessToken = response.authResponse.accessToken;
            alert(accessToken);
        } else if (response.status === 'not_authorized') {
            //login function
        } else {
            //login function
        }
    }, true);

    FB.Event.subscribe('auth.authResponseChange', function(response) {
        //console.log('The status of the session changed to: '+response.status);
        window.location.reload();
    });
};

Если вы установитеstatus вtrue,FB.getLoginStatus объект ответа будет кэшироваться SDK и последующими вызовамиFB.getLoginStatus вернет данные из этого кэшированного ответа.

Чтобы обойти это, вы должны позвонитьFB.getLoginStatus со вторым параметром, установленным наtrue заставить туда и обратно в Facebook - эффективно обновить кэш объекта ответа.

FB Docs:https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

status = true кэшируется, поэтому вам нужен параметр true в getLoginStatus ().
Кэширование не было проблемой, которую я описал выше. Установка status = true в fb.init должна вызвать проверку статуса входа в систему, тогда событие изменения статуса должно сработать, когда эта проверка произойдет. Ed Hinchliffe
14

в параметрах fb.init, чтобы явно вызывать getloginstatus отдельно.

IF get loginstatus вернулся как неизвестный (то есть вышел из системы), я подписался на событие изменения статуса, а также выполнил обычное отображение кнопки входа в систему. Затем, когда пользователь входит в систему, изменение статуса происходит, как и ожидалось.

им действительно удалось сделать большой беспорядок из чего-то, что должно было быть настолько простым

Похожие вопросы