FB.login问题,需要显示灯箱而不是弹出窗口,Javascript SDK,iFrame应用程序

时间:2010-10-13 11:11:35

标签: javascript facebook lightbox

我正在开发一个facebook iFrame应用程序,它将嵌入到facebook页面中。我已选择iFrame,因为Facebook已弃用FBML。

我的申请已准备好,但我面临一个小问题

调用FB.login时,会出现一个弹出窗口。我的应用程序要求是,无论何时加载,都应该检查用户是否被授权,如果没有,则显示一个要求扩展权限/登录的Dialog

问题: 弹出窗口是一个新窗口的形式,Safari默认阻止,因为窗口是通过javascript打开而不是通过点击,我希望它显示为facebook通常为fbml应用程序显示的灯箱/阴影

我在http://developers.facebook.com/blog/post/312看了

  

块引用   为了在连接帐户时提供更一致和安全的用户体验,当用户已经登录到Facebook时,当用户连接您的站点和Facebook之间的帐户时,我们会更改对话框的行为。以前,Connect with Facebook对话框出现在浏览器窗口的IFrame“lightbox”中。在明天的每周代码推送之后,对话框将弹出一个单独的浏览器窗口,其中包含一个地址栏,当用户未登录到Facebook并尝试将帐户与您的站点连接时,该地址栏与用户登录流程相匹配。这也将使用户更容易识别URL是否值得信赖且来自Facebook。   块引用

但是这个新功能显然无法帮助我。

对此有何解决方法?

我的代码:

 <script src="http://connect.facebook.net/en_US/all.js"></script>
    <script type="text/javascript">
        FB.init({ appId : '161077430577043', status : true, cookie : true, xfbml  : true });
        FB.getLoginStatus(function(response) {
            // alert("response: " + response.session);
            if (response.session) {
                // alert("response of getlogin status, permissions:  " + response.perms);
                login();
            }
            else{
                document.getElementById('loginStatus').innerHTML = "Login and Grant Permission";
                logMeIn();
            }
        });

        function logMeIn(){
            FB.login(function(response) {
                // alert("login!");
              if (response.session) {
                    // alert("Granted permissions: " + response.perms);
                    login();
                } else {
                    // alert("not logged in");
              }
            }, {perms:'read_stream,publish_stream,offline_access,friends_birthday,email'});
        }
        function login(){    
            FB.api('/me', function(response) {
                document.getElementById('login').innerHTML="Welcome " + response.name;
            });
            getFriendsData();
        }

        function getFriendsData(){
            //  fetches data from Graph API
        }

    </script>

3 个答案:

答案 0 :(得分:1)

我想出了如何解决这个问题。 现在我使用通过PHP生成的FBML提示和signed_request获取权限。

我错过了一个重要的观点,即一旦授予了权限,无论使用何种sdk,它们都将可用。即从fbml获得许可并使用它们与php

答案 1 :(得分:0)

我认为出于安全原因,他们不允许登录流程进入iframe。唯一的方法是将用户重定向到登录页面(替换当前页面)。这可以在服务器端或客户端完成。

答案 2 :(得分:0)

如果您从FB.login()事件中发起click来电,则浏览器不应阻止新窗口。

类似的东西:

<button onclick="logMeIn();">Log in with Facebook</button>

脚本:

function logMeIn() {
    FB.login(...);
}

来自Facebook文档(link):

  

如此函数的参考文档中所述,它会生成一个显示“登录”对话框的弹出窗口,因此只应在有人单击HTML按钮时调用(以便浏览器不会阻止弹出窗口) )。