这是一个很好的问题。首先,用户登录到您的应用意味着您拥有该用户的有效访问令牌。
在使用此访问令牌进行 API 调用之前,无法确定访问令牌是否有效。因此,如果您想确保用户仍然在每个页面上登录,您必须在每个页面上对 Facebook 进行 API 调用。有点重,但没有其他解决方案。
您可以做的是假设您拥有的访问令牌是有效的,并且只检查一次(当您确实需要确保用户已登录时)。
你可以有不同的场景:
你没有关于用户的 Facebook 数据:用户肯定没有登录你的应用程序。
您可以读取用户 ID,但您可能没有该用户的访问令牌:该用户可能未登录。
您可以读取访问令牌,但它可能无效(已过期或被用户撤销):用户可能未登录。
您有一个有效的访问令牌:用户肯定已登录。
您可以在会话中读取用户 ID 和访问令牌。会话数组如下所示:
[fb_148195765253871_access_token] => 14819576525...
[fb_148195765253871_user_id] => 1536397056
数组键中的数字(此处148195765253871
)是您的应用 ID。
因此,您可以在每个页面上执行的操作是检查这些密钥是否已设置,如果未设置,请加载 SDK 并仔细检查(因为访问权限可以存储在 SDK 正在读取的其他一些地方):
if (isset($_SESSION['fb' . YOUR_APP_ID . 'access_token'])) {
// assume to user is logged in
// and keep going
} else {
require "facebook.php";
$facebook = new Facebook(array(
'appId' => YOUR_APP_ID,
'secret' => YOUR_APP_SECRET,
));
// Make an API call to be sure the user is logged in
// ie : that you have a valid access token
$user = $facebook->getUser(); // User ID
if ($user) {
try {
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
$user = null;
}
}
if ($user) {
// The user is logged in for sure
} else {
// The user is not logged in for sure
// Make him log in
echo '<a href="' . $facebook->getLoginUrl() . '">Login with Facebook</a>';
}
}
希望有帮助!