我不确定php服务器端的Facebook库是否在加载时验证会话。那么我想知道是否有一个最佳实践来确保我确实有一个有效的FB会话而不是一些破解者改变$ _COOKIE数据。
$fb = new Facebook();
if( $fb->session_expires !== 0 && $fb->session_expires < time() ) {
die('bad and/or old session');
}
或者测试用户FB id是否更好?
$fb = new Facebook();
if( $fb->user ) {
die('no Facebook User Id given');
}
编辑: 好的,according to facebook“您的客户端库应该为您执行所有必要的验证”,通过使用应用程序机密来md5所有参数并验证散列。所以如果你有一个会话 - 它是一个有效的FB生成的会话(尽管它仍然可以过期)。
假设您登录到连接应用。然后你注销FB。如果您在该连接应用程序上加载另一个页面,则FB JS没有任何机会更改cookie以声明您实际已注销。而且由于PHP库实际上并没有调用FB来验证你的会话,所以它也不知道要删除坏的值。
结果是您从FB发送的一组有效的cookie不再有任何好处。因此,如果您尝试调用需要会话的API方法,那么您的应用程序将抛出致命错误。
答案 0 :(得分:0)
迟到的答案但是,目前Facebook PHP类有一个getSession()
方法:
if ($facebook->getSession()) {
// Do stuff
}
答案 1 :(得分:0)
调用API方法$facebook->getUser()
,并检查用户是否有效。
https://github.com/facebook/facebook-php-sdk/blob/master/src/base_facebook.php#L508
与SDK中提供的示例一样
// Get User ID
$user = $facebook->getUser();
// We may or may not have this data based on whether the user is logged in.
//
// If we have a $user id here, it means we know the user is logged into
// Facebook, but we don't know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.
if ($user) {
try {
// Proceed knowing you have a logged in user who's authenticated.
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
}