Facebook Connect 登录按钮无法渲染

5
我正在尝试实现一个Facebook Connect Single Sign-on网站。最初,我只有一个Connect按钮(<fb:login-button>),用户每次想要登录时都必须点击该按钮。现在我已经实现了自动登录和注销功能。也就是说,如果我的网站可以找到与之匹配的用户帐号,它将检测到已登录的Facebook帐户并自动对其进行身份验证,并在Facebook会话丢失时自动取消身份验证。我还有一个手动注销按钮,可以将用户从我的网站和Facebook中注销。所有这些都正常工作,但现在我的原始连接按钮间歇性地无法正确呈现。它只显示为普通的XHTML(即,它看起来像纯文本-而不是按钮-且无法单击),并且没有应用任何XFBML。以下是基本代码:

在每个页面上:

<body>
{...}
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script>

<script type="text/javascript>
FB.init('APIKey', '/xd_receiver.htm');

var isAuth; // isAuth determines if the user is authenticated on my site
            // it should be true on the logout page, false on the login page
FB.ensureInit(function(){ 
    var session = FB.Facebook.apiClient.get_session();
    if (session && !isAuth) {
        PageMethods.FacebookLogin(session.uid, session.session_key, FBLogin, FBLoginFail);
        // This is an AJAX call that authenticates the user on my site. 
    } else if(!session && isFBAuth) {
        PageMethods.FacebookLogout(FBLogout, FBLogoutFail);
        // This is an AJAX call that deauthenticates the user on my site.
    }
    // the callback functions do nothing at the moment
});
</script>

{...}
</body>

在登录页面:(已登录用户无法看到此页面)

<body>
{...}
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script>

<script type="text/javascript>
    FB.init('APIKey', '/xd_receiver.htm');
    {...} // auto-auth code as on every page
</script>

<!-- This is the button that fails to render -->
<fb:login-button v="2" onlogin="UserSignedIntoFB();" size="large" autologoutlink="true"><fb:intl>Login With Your Facebook Account</fb:intl></fb:login-button>

<script type="text/javascript">
    function UserSignedIntoFB() {
        {...} // posts back to the server which authenticates the user on my site & redirects
    }
</script>
{...}
</body>      

在登出页面上:(未登录用户无法看到此页面)
<body>
{...}
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script>

<script type="text/javascript>
    FB.init('APIKey', '/xd_receiver.htm');
    {...} // auto-auth code as on every page
</script>

<script type="text/javascript">
    function FBLoggedOut() {
        {...} // posts back to the server which deauthenticates the user on my site & redirects to login
    }

    function Logout() {
        if (FB.Facebook.apiClient.get_session()) {
            FB.Connect.logout(FBLoggedOut); // logs out of Facebook if it's a Facebook account
            return false;
        } else {
            return true; // posts back if it's a non-Facebook account & redirects to login
        }
    }
</script>
<a onclick="return Logout();" href="postback_url">Sign Out</a>
{...}
</body>

我已经查看了一些内容:

  • 自动登录和注销功能非常好用。我可以在另一个选项卡上登录和退出Facebook,我的网站会注意到会话变化并相应地进行更新。
  • 注销似乎正常工作:当点击注销时,它会取消用户的身份验证并将其从Facebook中注销。
  • 问题通常发生在Facebook用户注销后,但有时不定期出现;它可能在他们登录之前就发生了,并且在几分钟/刷新后消失。
  • 登录/注销过程中留下了一些cookie,但删除它们无法解决问题。
  • 重新启动浏览器无法解决问题。
  • 当问题发生时,用户肯定已经从Facebook和我的网站注销。我已检查了Facebook会话和网站身份验证。
  • 所有外部脚本调用都被正确提供。
  • 编辑:此外,当登录按钮显示时,它可以正常工作。

我怀疑注销时还需要做其他事情(例如清除会话或cookie),但根据我阅读的Facebook Connect的所有内容,我只需要调用注销函数(并在服务器端取消身份验证)。我真的很困惑,请问有人知道出了什么问题吗?


首先,我会尝试删除除了FeatureLoader.js.php加载、FB.Init和fb:login-button之外的所有内容,看看是否一切正常。根据这个实验的结果,你必须继续调试。 - zerkms
好的,我现在正在这样做,似乎可以工作,但没有自动登录功能。我只是希望知道我哪里出了问题。 - tloflin
1个回答

6
请确保在页面的最后调用Facebook JS包含(FeatureLoader),这样您的页面就可以渲染,然后Facebook JS会在事后进行一些魔术操作,将文本转换为按钮。否则,就会出现在浏览器中加载您的网站内容和调用fb服务器之间的竞争...至少这是我遇到的问题。

1
我暂时接受这个答案,因为这种行为似乎已经消失了,尽管我还没有完全测试。 - tloflin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接