Facebook登录网站:处理用户Facebook注销的最佳做法?

时间:2012-02-06 15:06:53

标签: javascript facebook facebook-graph-api

我正在编写一个webapp,用户需要使用Facebook登录(在应用程序的上下文中,无Facebook登录没有意义)。理想情况下,在初次访问后,当用户访问/index时,我的网络应用会看到之前存放的Cookie,并自动无缝地将用户登录并转到应用程序(/app)。

当用户退出Facebook并返回我的应用程序时,我的问题就出现了。由于我们域中的Cookie仍然存在,并且他们的oauth_token仍然有效(现在为60天),我仍然可以自动登录用户,应用程序将按预期工作。

对我来说,即使他们没有登录Facebook,该应用程序仍然使用他们的Facebook帐户登录似乎不对。我在Stackoverflow上玩了一下;它也允许这种行为。我的担忧是否错位,或是否有建议的方法来查看用户是否在我的服务器首次请求/index时登录Facebook。

1 个答案:

答案 0 :(得分:2)

在我看来,我不认为您的应用应该在用户已经退出Facebook时保持登录状态。

这可能不太理想的一种情况是:如果我在公共计算机上使用您的应用程序该怎么办?在我退出Facebook后,您的应用仍“记住”我。现在,任何使用此计算机的人都会在您的应用程序中使用我的Facebook身份。

我认为这里的问题是您设置自己的cookie以记住用户的Facebook登录状态。显然,当用户从Facebook本身退出时,您的cookie不会被清除。所以此时你的cookie与Facebook状态不同步。

我建议您不要使用自己的cookie来记住用户的Facebook登录状态。为此目的,始终依靠Facebook本身。

一般策略是,每当用户访问您的应用时,您应该使用Facebook提供的机制检查Facebook登录状态。这样,您的应用就用户的登录状态而言将与Facebook同步。

我个人使用这段代码来调用Facebook Javascript API以便用户登录:

/* 
 * Init code for Facebook connect
 */
window.fbAsyncInit = function() {
        FB.init({
                appId      : FACEBOOK_APP_ID, // App ID
                channelUrl : CHANNEL_URL, // Channel File
                status     : true, // check login status
                cookie     : true, // enable cookies to allow the server to access the session
                xfbml      : true,  // parse XFBML
                oauth      : true
        });

        // check facebook login status
        FB.getLoginStatus(function(response) {
                console.log("FB login status: " + response.status);
                if (response.status === 'connected') {
                        showWelcome();  //display welcome message
                } else if (response.status === 'not_authorized') {
                        // the user is logged in to Facebook, but not connected to the app
                        showFbLogin();  //display Facebook Login button
                } else {
                        // the user isn't even logged in to Facebook.
                        showFbLogin();  //display Facebook Login button
                }
        });

        // subscribe to facebook events
        FB.Event.subscribe('auth.authResponseChange', function(response) {
                fbAuthResponseChanged(response);
        });
};