我正在使用Facebook's PHP SDK将用户登录到我的网站,如下所示:
<?php
$facebook = new Facebook(array(
"appId" => "myAppID",
"secret" => "mySecret",
));
$user = $facebook->getUser();
if ($user) {
try {
// user is authenticated
$user_profile = $facebook->api("/me");
} catch (FacebookApiException $ex) {
$user = null;
}
}
if ($user) {
$logoutURL = $facebook->getLogoutUrl();
?>
<img src="https://graph.facebook.com/<?php echo $user; ?>/picture" />
<a href="<?php echo($logoutURL); ?>">Logout</a>
<pre><?php print_r($user_profile); ?></pre>
<?php
} else {
?>
<a href="<?php echo($loginURL); ?>">Login</a>
<?php
}
?>
问题是当用户返回网站时,他们不再登录,并且必须重新登录。
返回用户是否可以保持登录状态?
更新
我的确切解决方案最终是JavaScript和PHP Facebook SDK的组合。
问题是cookie不用于存储Facebook登录信息 - PHP会话(PHP会话cookie在浏览器关闭时到期)。除此之外,除非您具有脱机访问权限,否则访问令牌将过期。换句话说,即使您将Facebook访问令牌存储在cookie中,它最终也会过期,并且用户将被注销。
我最终使用的JavaScript:
FB.init({
appId: "myAppID",
cookie: true, // enable cookies to allow the server to access the session
xfbml: true, // parse XFBML
oauth: true // enable OAuth 2.0
});
FB.Event.subscribe("auth.login", function(response) {
// a user logged in who was not previously logged in
window.location.refresh(true); // ideally modify the page with JS rather than refreshing
});
FB.Event.subscribe("auth.logout", function(response) {
// a user logged out who was previously logged in
window.location.refresh(true); // ideally modify the page with JS rather than refreshing
});
// check if the user is logged in or not, using the Facebook JS SDK
FB.getLoginStatus(null);
当页面加载时,Facebook JavaScript SDK会检查用户是否已登录。如果用户已登录,并且尚未设置cookie,则会设置。然后,您可以刷新页面(或者,理想情况下,使用JavaScript修改它),服务器将能够使用常规PHP SDK(以及此问题中的第一段代码)访问cookie。
这是我在浏览会话中发现持久登录的最佳方法。
答案 0 :(得分:4)
这里有两种情况。一种是验证用户,另一种是识别用户。
当您使用任何Facebook API提供的登录方法时,通常会发生的情况是,他们会看到用户是否与Facebook进行了会话。如果不是,则会提示用户登录,以便您可以看到它是哪个用户。在您的情况下,您希望用户始终登录到Facebook。这不是真的可行,因为你需要找出它是哪个用户。您可以使用一些识别详细信息在用户计算机上存储cookie。您需要为用户提供脱机权限,否则用户必须使用API登录才能获得新的access_token。
如果您需要我的建议,您应该使用API的GetLoginStatus方法来检查用户是否与Facebook进行了会话。如果用户未登录Facebook,则要求他们登录您的网站并不是太多。大多数使用Facebook的用户都存储了他们的登录信息,因此只要他们的浏览器处于打开状态,他们就会一直进行会话。
这将是/它是最好的方式,因为它不要求您询问用户的离线权限,我想许多用户不想给。如果由于某种原因你不能使用这种方法,我建议获得离线许可,然后在他们的计算机上存储一个没有计时器的cookie,这样它就不会被自动删除。
对不起文字的墙,但我希望我有点帮助:)