2013-07-04 2 views
2

Я следую railscast, чтобы добавить функцию «Войдите в систему с Facebook» на моем сайте, нет проблем с регистрацией. Но при попытке выйти из системы, то кажется, что FB.getLoginStatus никогда не огонь, даже если отключить Sandbox Mode в настройках приложения разработчика facebook (как это было предложено в другой дискуссии):FB.getLoginStatus не работает в Chrome, даже песочница отключена

(function() { 
    jQuery(function() { 
    $('body').prepend('<div id="fb-root"></div>'); 
return $.ajax({ 
    url: "" + window.location.protocol + "//connect.facebook.net/en_US/all.js", 
    dataType: 'script', 
    cache: true 
}); 
}); 

window.fbAsyncInit = function() { 
FB.init({ 
    appId: 'xxxxxomittedxxxxx', 
    cookie: true, 
    status: true, 
    xfbml: true, 
    oauth: true 
    }); 
$('#sign_in').click(function(e) { 
    e.preventDefault(); 
    return FB.login(function(response) { 
    if (response.authResponse) { 
     return window.location = '/auth/facebook/callback'; 
    } 
    }); 
}); 
return $('#sign_out').click(function(e) { 
    FB.getLoginStatus(function(response) { 
    if (response.authResponse) { 
     return FB.logout(response.authResponse); 
    } 
    }); 
    return true; 
}); 
}; 

}).call(this); 

Причина Я знаю FB.getLoginStatus никогда не (или не работает), я заменить тело:

FB.getLoginStatus(function(response) { 
    return alert("I am here!"); 
    }); 

, и я не могу видеть мое уведомление в то время как «sign_out» нажмите кнопку.

Я работаю как в Chrome, так и в Firefox, имеющих такое же поведение. Может ли кто-нибудь помочь определить, что мне не хватает? Большое спасибо.

Позвольте мне описать более конкретно о «поведении» я столкнулся:

  1. войти с Facebook из mysite.com впервые окно Логин Facebook будет всплывать и попросить адрес электронной почты и пароль, и я могу зайдите на мой сайт отлично нормально и работайте как ожидалось
  2. затем я нажимаю на кнопку sign_out от mysite.com/users/1, похоже, что он выйдет ок.
  3. затем снова войдите в систему с Facebook с сайта mysite.com, теперь он больше не будет всплывать в окне входа в систему Facebook и напрямую подключается к mysite.com/users/1 без запроса электронной почты и пароля!
  4. Если я открою другое окно браузера и перейду на facebook.com и выйдите из него, тогда, когда я войду в Facebook с сайта mysite.com, он откроет окно входа в Facebook и попросит мой адрес электронной почты и пароль.

Я хотел бы мой сайт себя: «когда выход из системы из mysite.com/users/n и войти в систему с Facebook снова с mysite.com, окно Войти Facebook будет всплывать»

Любой может быть помощи? Большое спасибо.

EDIT:

Дальнейшие исследования обнаружили, что «корень» причина может быть еще: знак вне находится под другим маршрутом (или страницы) знака в маршруте и FB.getLoginStatus просто не может быть пожар под mysite.com/signout. Сообщение об ошибке из firebug указывает, что «данный URL-адрес не разрешен конфигурацией приложения: один или несколько указанных URL-адресов не разрешены настройками приложения. Он должен соответствовать URL-адресу веб-сайта или холста, или домен должен быть субдомен одного из доменов приложения. "

Чтобы убедиться, что это проблема маршрута, я помещаю ссылку на один маршрут (страницу) в качестве знака в маршруте, который является корневым маршрутом mysite.com, как указано в «Веб-сайте с использованием Facebook», все работает и может выйти из системы, как и ожидалось:

<%= link_to "sign out facebook", "#" , id: "sign_out" %> 

кстати sign_out JS была пересмотрена, чтобы избавиться от FB.logout (response.authResponse) неперехваченное [объект Object] ошибка, потому что FB.logout ожидает функции в качестве параметра:

return $('#sign_out').click(function(e) { 
    FB.getLoginStatus(function(response) { 
    if (response.authResponse) { 
     FB.logout(); 
    } 
    }, true); 
}); 
}; 

Итак, в нижней строке: FB.getLoginStatus может все еще имеют ошибку, которая не может обрабатывать вызов с другого маршрута, чем знак в маршруте. (Я тестировал Chrome, Firefox и Safari, и все они ведут себя одинаково, но не соответствуют IE10.Как-то IE10 работает, даже выйдя на другой маршрут.)

Любые комментарии от людей, которые имеют схожие проблемы? Пожалуйста, порекомендуйте. Заранее большое спасибо.

ответ

0

Попробуйте добавить верно в качестве второго параметра getLoginStatus, как указано в FB Dev документ:

FB.getLoginStatus(function(response) { 
    // this will be called when the roundtrip to Facebook has completed 
}, true); 

Это следует избегать кэширования. Другой вариант, чтобы подписаться на события:

FB.Event.subscribe('auth.login', function(response) { 
    // do something with response 
}); 

Все от here

комментарий, если у вас есть вопросы.

EDIT:

Я изменил сценарий немного, удалены ненужные части кода. У вас слишком много возвратов, которые не нужны. Я попытался выйти из этого модифицированного скрипта, он работает так, как вам нужно. Подписка на мероприятия предназначена для проверки.

<head> 
    <title>Exam entry</title> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script> 
</head> 
<body> 
    <div id="fb-root"></div> 

    <input type="button" value="Sign in" id="sign_in" /> 
    <input type="button" value="Sign out" id="sign_out" /> 

    <script type="text/javascript"> 
     window.fbAsyncInit = function() { 
      FB.init({ 
       appId: '586844044669652', 
       cookie: true, 
       status: true, 
       xfbml: true 
      }); 


      // Here we subscribe to the auth.authResponseChange JavaScript event. This event is fired 
      // for any authentication related change, such as login, logout or session refresh. This means that 
      // whenever someone who was previously logged out tries to log in again, the correct case below 
      // will be handled. 
      FB.Event.subscribe('auth.authResponseChange', function (response) { 
       // Here we specify what we do with the response anytime this event occurs. 
       if (response.status === 'connected') { 
        // The response object is returned with a status field that lets the app know the current 
        // login status of the person. In this case, we're handling the situation where they 
        // have logged in to the app. 
        testAPI(); 
       } /*else if (response.status === 'not_authorized') { 
        // In this case, the person is logged into Facebook, but not into the app, so we call 
        // FB.login() to prompt them to do so. 
        // In real-life usage, you wouldn't want to immediately prompt someone to login 
        // like this, for two reasons: 
        // (1) JavaScript created popup windows are blocked by most browsers unless they 
        // result from direct interaction from people using the app (such as a mouse click) 
        // (2) it is a bad experience to be continually prompted to login upon page load. 
        FB.login(); 
       } else { 
        // In this case, the person is not logged into Facebook, so we call the login() 
        // function to prompt them to do so. Note that at this stage there is no indication 
        // of whether they are logged into the app. If they aren't then they'll see the Login 
        // dialog right after they log in to Facebook. 
        // The same caveats as above apply to the FB.login() call here. 
        FB.login(); 
       }*/ 
      }); 


      $('#sign_in').click(function (e) { 
       e.preventDefault(); 
       FB.login(function (response) { 
        if (response.authResponse) { 
         //return window.location = '/auth/facebook/callback'; 
        } 
       }); 
      }); 
      $('#sign_out').click(function (e) { 
       FB.logout(function (response) { 
        console.log("Here logout response", response); 
       }); 
      }); 

     }; 

     // Here we run a very simple test of the Graph API after login is successful. 
     // This testAPI() function is only called in those cases. 
     function testAPI() { 
      console.log('Welcome! Fetching your information.... '); 
      FB.api('/me', function (response) { 
       console.log('Good to see you, ' + response.name + '.'); 
      }); 
     } 

     // Load the SDK asynchronously 
     (function (d) { 
      var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; 
      if (d.getElementById(id)) { return; } 
      js = d.createElement('script'); js.id = id; js.async = true; 
      js.src = "//connect.facebook.net/en_US/all.js"; 
      ref.parentNode.insertBefore(js, ref); 
     }(document)); 
    </script> 
</body> 
+0

Большое спасибо за предложение, попробовали оба, но одно и то же поведение. Все еще не может войти и сделать что-то с ответом. В моем случае я не могу FB.logout. –

+0

Спасибо за помощь. Я попробовал свои js. Он ведет себя так же, как и раньше, и с одним дополнительным сообщением об ошибке: FB.logout(), вызываемый без токена доступа. –

+0

Можете ли вы показать мне свою полную страницу? – EnterSB

Смежные вопросы