有没有一种方法可以静态使用facebookconnectapi?
当我们使用facebookphp-sdk时,登录到facebook的链接或按钮类似于https://www.facebook.com/dialog/oauth..................
我想要的是取消在每个页面上包含php-sdk,因为它会在高峰时段导致一些额外的处理和服务器负载。
我想进行一次会话检查,以了解用户是否登录,例如,检查他的facebook用户id和姓名是否存储在会话中,如果没有,则显示一个静态登录按钮。然后,在登录facebook后,他将访问facebook-login.php,其中将包括facebookphp-sdk,并处理他的数据并将其存储在会话中,这样他就可以保持登录状态,而不在每个页面中包括php-sdk。
我使用$facebook->getLoginUrl()得到的url结构是:
https://www.facebook.com/dialog/oauth?client_id={MY_APP_KEY}&scope={PERMISSIONS}&redirect_uri={MY_SITE/Facebooklogin.php}&状态={A_32_CHAR_CODE_LIKE_MD5_MAYBE}
最后一个问题是:登录按钮中的URL是什么?
只需加载sdk并执行以下操作:
echo '<a href="' . $facebook->getLoginUrl( array('next'=>'http://mysite.com', 'req_perms' => 'email,read_stream,publish_stream')) . '">Connect to Facebook</a>';
该url对于已注销的用户始终有效
这是个好问题。首先,用户登录到您的应用程序意味着您拥有该用户的有效访问令牌。
在使用访问令牌进行API调用之前,无法确保访问令牌有效。因此,如果你想确保用户仍然登录到每个页面,你必须在每个页面上对Facebook进行API调用。有点重,但没有其他解决方案。
您可以做的是假设您拥有的访问令牌是有效的,并且只检查一次(当您确实需要确保用户已登录时)。
你可以有不同的场景:
-
您没有关于该用户的脸书数据:该用户肯定没有登录您的应用程序。
-
您可以读取用户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>';
}
}
希望能有所帮助!
所选答案并不能真正回答问题。
如果你想将生成getLoginUrl函数调用所需的所有Facebook代码隔离到一个单独的文件中,你可以通过使用元刷新轻松地做到这一点。
因此,在您的标题中指向"使用Facebook登录"到"Facebook_Login.php"的链接。在此页面上,包括SDK对getLoginUrl的必要调用,然后添加以下HTML行。
<meta http-equiv="refresh" content="0;URL=<?=$helper->getLoginUrl(array('email', 'user_friends'));?>">
我对此进行了多次测试,结果很有效。
仅供参考,使用Facebook SDK 4.0。