我正在构建一个小型 Facebook 应用程序,我最终需要在客户端 (JS) 和服务器 (PHP) 上使用 Facebook SDK 中的方法。在客户端,我主要使用 FB.ui 方法,而在服务器上,我大量使用 Graph API。
但是,有没有办法做到这一点而不必强制用户登录两次?如何让用户登录一次,并将该登录名用于客户端和服务器?这可能吗?
我正在构建一个小型 Facebook 应用程序,我最终需要在客户端 (JS) 和服务器 (PHP) 上使用 Facebook SDK 中的方法。在客户端,我主要使用 FB.ui 方法,而在服务器上,我大量使用 Graph API。
但是,有没有办法做到这一点而不必强制用户登录两次?如何让用户登录一次,并将该登录名用于客户端和服务器?这可能吗?
在 JS 和 PHP 中仅通过一次登录(或不登录)使用 Facebook SDK 的最佳方式是使用token。“服务器端”过程在 JS 和 PHP 中是相同的。
此过程对于首次用户登录或在过期时拥有新令牌很有用。
现在,您的应用程序可以在没有用户登录的情况下与 Facebook 建立连接(在 JS、PHP 或其他中)。所需的元素是您的appId、您的密码、用户ID和用户令牌。
希望能帮到你
事实上,这不起作用,因为令牌过期得很快。offline_access 也被删除了,因此当您想与他保持联系时,用户必须明确使用 facebook 应用程序(当令牌过期时,您根本无法做任何事情)。
您仍然可以保存当前令牌以用于登录目的,但您应该在每次用户再次通过 FB 登录时更新用户表。
此外,您不能通过令牌登录,但您可以很容易地在 JS 或 PHP 中获取令牌。
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
//user is logged in and has accepted you apps stuff.
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
// do some fancy ajax function to send the token to the server here.
}
else if (response.status === 'not_authorized') {
// the user is logged in to Facebook,
// but has not authenticated your app
FB.login(function(response) {
if (response.authResponse) {
console.log('Welcome! Fetching your information.... ');
FB.api('/me', function(response) {
console.log('Good to see you, ' + response.name + '.');
});
} else {
console.log('User cancelled login or did not fully authorize.');
}
}), {scope: 'email,user_likes'}); //specify all the scopes you need for your app here.
}
else
{
//user is not logged in to facebook.
}
});
那将是获取令牌的 JS 部分,如果您想使用 PHP 获取它,那就更容易了。
<?php
require_once("/FBAPI/src/facebook.php");
$config = array();
$config['appId'] = 'your_app_id';
$config['secret'] = 'your_app_secret';
$facebook = new Facebook($config);
$user = $facebook->getUser();
if(!$user){
$loginUrl = $facebook->getLoginUrl(array('scope'=>'publish_stream', 'redirect_uri'=>'http://www.example.com'));
}
if($user){
try{
$user_profile = $facebook->api('/me');
$access_token = $facebook->getAccessToken();
}
catch(FacebookApiException $e){
error_log($e);
$user = NULL;
}
}
else{
echo '<a href="'.$loginUrl.'"><img src="img/login.png"/></a>';
}
?>
编辑:事实上,你可以这样做:
显示登录页面,让用户通过JS登录。登录过程完成后,您可以通过 $facebook->getUser(); 检查用户是否已登录。PHP SDK的功能
当我使用 Heroku 部署我的教程 Facebook 应用程序时,我没有学到一个巧妙的技巧。在 Heroku 提供的示例模板上,他们有 Facebook 登录按钮并订阅了auth.authResponseChange,如下所示:-
FB.Event.subscribe('auth.authResponseChange', function(response) {
window.location = window.location;
});
这会导致页面刷新,并且在 Facebook 的身份验证后由 JavaScript SDK 设置的 cookie 将可用于 PHP SDK。您也可以通过 PHP SDK 登录用户,用户登录后 JavaScript SDK 将能够工作,无需再次从 JavaScript SDK 登录