我正在尝试实现一个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"></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的所有内容,我只需要调用注销函数(并在服务器端取消身份验证)。我真的很困惑,请问有人知道出了什么问题吗?