2013-10-30 133 views
2

根据其文档,我已经在FOSUserBundle的SonataUserBundle中实现了FOSFacebookBundle。Facebook登出无法正常工作

config.yml : 
    fos_facebook: 
      alias: facebook 
      app_id: xxxxxxxx597242 
      secret: xxxxxxxxxxxxxxxxxxxx2a6e7 
      cookie: true 
      permissions: [email, user_birthday, user_location] 
    services: 
     fos_facebook.user.login: 
      class: Webmuch\UserBundle\Security\User\Provider\FacebookProvider 
      arguments: 
       facebook: "@fos_facebook.api" 
       userManager: "@fos_user.user_manager" 
       validator: "@validator" 

security.yml: 
    providers: 
     chain_provider: 
      chain: 
       providers: [fos_userbundle,fos_facebook_provider] 
     fos_userbundle: 
      id: fos_user.user_provider.username_email 
     fos_facebook_provider: 
      id: fos_facebook.user.login 
    firewalls: 
     main: 
      pattern: ^/ 
      fos_facebook: 
        app_url: "https://developers.facebook.com/apps/xxxxxxxx597242" 
        server_url: "http://localhost/Mysite/web/app_dev.php/" 
        login_path: /login 
        check_path: /login_check 
        provider: fos_facebook_provider 
        default_target_path:/
      form_login: 
        provider: fos_userbundle 
        login_path:  /login 
        use_forward: false 
        check_path:  /login_check 
        failure_path: null 
      logout: 
       path: /logout 
       target:/
      anonymous: true 

base.html.twig:

{{ facebook_initialize({'xfbml': true, 'fbAsyncInit': 'onFbInit();'}) }} 
    {{ facebook_login_button({'autologoutlink': true}) }} 

    {% block javascripts %} 
     <script> 
      function goLogIn(){ 
       window.location.href = "{{ path('fos_facebook_security_check') }}"; 
      } 

      function onFbInit() { 
        if (typeof(FB) != 'undefined' && FB != null) {    
        FB.Event.subscribe('auth.statusChange', function(response) { 
        if (response.session || response.authResponse) { 
        setTimeout(goLogIn, 500); 
        } else { 
        window.location.href = "{{ path('fos_user_security_logout') }}"; 
         } 
        }); 
       } 
      } 
     </script> 
    {% endblock %} 

我的Facebook的提供者和使用者实体被设置为每文档。

这是工作得很好,但现在更新后的新版本,它是登录成功后在我的网站身份验证,但当我点击Facebook登出按钮,现在只有Facebook登出,而在我的网站,我仍然在登录状态下,即它不会破坏我的站点身份验证会话。

我不知道我做错了什么。

回答

1

最后经过了很多挠我脑海中我发现错误的根源;它是Symfony的包装的在供应商的安全部件,其中在位于HTTP文件夹防火墙的文件夹,文件“AbstractAuthenticationListener.php”对线问题190

$token = $this->securityContext->getToken(); 
if ($token instanceof UsernamePasswordToken && $this->providerKey === $token->getProviderKey()) { 
$this->securityContext->setToken(null); 
} 

由于Facebook的API使用“FacebookAccessToken”而不是 “UsernamePasswordToken”,所以Facebook注销只是摧毁其 自己的(脸书)会议,但无法破坏会话的网站身份验证 。

因此,如果我们只设置

$this->securityContext->setToken(null) 

对上述四大行的地方,问题得到解决,一切都工作得非常细。我知道改变供应商并不是一个好主意,但它工作得很好,我会欢迎任何更多的想法。