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

KJ *_*dis 5 javascript facebook facebook-graph-api

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

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

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

小智 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);
        });
};
Run Code Online (Sandbox Code Playgroud)