Chrome阻止了FB.login()

时间:2014-11-14 14:11:13

标签: facebook google-chrome facebook-javascript-sdk

我有一个FB应用程序需要集成在FB页面选项卡中。在应用程序中,我想提供一个"注册与FB登录"选项。单击此按钮应提示用户登录FB登录对话框。成功登录后,它应提示用户进行身份验证并允许应用程序使用其详细信息。一旦用户允许应用访问用户详细信息,它应该在新窗口中将详细信息发布到我的网站。

当我独立测试应用程序时,此过程正常。但是,当我将应用程序添加到fb页面时,chrome会阻止Fb登录对话框。在打开Fb登录对话框之前,我会检查用户是否已登录FB并已接受该应用程序。为此,我使用FB.getLoginStatus(checkLoginStatus);我认为由于这次检查,上下文转移到脚本执行,因此Chrome会阻止登录对话框。

是否有解决此问题的方法?帮助将受到高度赞赏。

我的代码如下:

使用span创建facebook按钮,并将id fbc-login-button赋予标签。

$("#fbc-login-button").click(function(){
   FB.getLoginStatus(function(response) {
                if (response.status === 'connected') {
                    console.log('Logged in.');
                    if (response.authResponse) {
                        fbAppSignup(response);
                    }
                }
                else {
                    FB.login(function(response) {
                        if (response.authResponse) {
                            fbAppSignup(response);
                        }
                    },{scope: "email, user_friends",display:"popup"});
                }
            });

    function fbAppSignup(response,myPopup){
        var uid = response.authResponse.userID;
        var accessToken = response.authResponse.accessToken;
        FB.api("/me", function(response) { 
            $("#social_media_data").val(JSON.stringify(response));
            $("#medium").val("facebook");
            $("#accessToken").val(accessToken);
            $("#socialClickSource").val("fbapp_facebook_signup");
            $("#fbSignUp").submit();
            return true;
        });
    }

1 个答案:

答案 0 :(得分:1)

Facebook文档中的示例有点误导,您不应该在异步回调函数中使用FB.login - 这正是您现在正在做的事情,因为FB.getLoginStatus是异步的。始终在用户交互(鼠标单击)上调用FB.login,否则它将被智能浏览器阻止。

  • FB.getLoginStatus:在页面加载时,用于刷新用户会话和 检查用户是否已获得授权
  • FB.login:关于用户互动

我回答过关于这个问题的其他主题: