我正在编写一个webapp,用户需要使用Facebook登录(在应用程序的上下文中,无Facebook登录没有意义)。理想情况下,在初次访问后,当用户访问/index
时,我的网络应用会看到之前存放的Cookie,并自动无缝地将用户登录并转到应用程序(/app
)。
当用户退出Facebook并返回我的应用程序时,我的问题就出现了。由于我们域中的Cookie仍然存在,并且他们的oauth_token
仍然有效(现在为60天),我仍然可以自动登录用户,应用程序将按预期工作。
对我来说,即使他们没有登录Facebook,该应用程序仍然使用他们的Facebook帐户登录似乎不对。我在Stackoverflow上玩了一下;它也允许这种行为。我的担忧是否错位,或是否有建议的方法来查看用户是否在我的服务器首次请求/index
时登录Facebook。
答案 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);
});
};