Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 网站Facebook登录:处理用户Facebook注销的最佳实践?_Javascript_Facebook_Facebook Graph Api - Fatal编程技术网

Javascript 网站Facebook登录:处理用户Facebook注销的最佳实践?

Javascript 网站Facebook登录:处理用户Facebook注销的最佳实践?,javascript,facebook,facebook-graph-api,Javascript,Facebook,Facebook Graph Api,我正在编写一个网络应用程序,用户需要使用Facebook登录(在应用程序的上下文中,无脸登录没有意义)。理想情况下,在初次访问之后,当用户访问/index,我的webapp会看到它先前存放的cookie,并自动无缝地将用户登录并转到应用程序(/app) 当用户注销Facebook并返回到我的应用程序时,我的问题就出现了。由于他们在我的域名上的cookie仍然存在,他们的oauth_令牌仍然有效(现在有效60天),我仍然可以自动登录用户,应用程序将按预期工作 在我看来,即使他们没有登录Facebo

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

当用户注销Facebook并返回到我的应用程序时,我的问题就出现了。由于他们在我的域名上的cookie仍然存在,他们的
oauth_令牌仍然有效(现在有效60天),我仍然可以自动登录用户,应用程序将按预期工作


在我看来,即使他们没有登录Facebook,应用程序仍然使用他们的Facebook帐户登录似乎是不对的。我在Stackoverflow上玩;它也允许这种行为。我的担心是不是放错地方了,或者有没有一种推荐的方法可以查看用户第一次从我的服务器请求
/index
时是否已登录Facebook。

在我看来,当用户已从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);
        });
};

问题是,当他们从facebook注销时,FBJS cookie在我的域名上没有被清除。在注销facebook并转到我的应用程序后,我的应用程序仍然可以看到FBJS cookie。在我加载javascript之前,我不知道他们是否真正登录。如果他们登录,这会增加一个额外的重定向,因为他们必须加载my/login页面,js随后会发现他们已经登录,并将他们重定向到/app。按照我的看法,每次你的应用程序代表登录的用户执行任何操作时,你都需要检查该用户是否仍在登录。无论您的应用程序设置了什么cookie来记住Facebook用户登录状态,您都不应该依赖它,或者您应该让它与Facebook状态保持同步。例如,您可以在每次应用程序发布到Facebook之前调用FB.getLoginStatus函数。当然,这可能不是最佳的方法。