0

我正在构建一个小型 Facebook 应用程序,我最终需要在客户端 (JS) 和服务器 (PHP) 上使用 Facebook SDK 中的方法。在客户端,我主要使用 FB.ui 方法,而在服务器上,我大量使用 Graph API。

但是,有没有办法做到这一点而不必强制用户登录两次?如何让用户登录一次,并将该登录名用于客户端和服务器?这可能吗?

4

3 回答 3

2

在 JS 和 PHP 中仅通过一次登录(或不登录)使用 Facebook SDK 的最佳方式是使用token。“服务器端”过程在 JS 和 PHP 中是相同的。

此过程对于首次用户登录或在过期时拥有新令牌很有用。

  1. 从您的页面,用户被重定向到 Facebook 以授权您的应用程序。
  2. 用户接受后,Facebook 使用令牌、Facebook ID、名字、姓氏、电子邮件等重定向您页面上的用户。
  3. 将用户信息保存在数据库中

现在,您的应用程序可以在没有用户登录的情况下与 Facebook 建立连接(在 JS、PHP 或其他中)。所需的元素是您的appId、您的密码、用户ID和用户令牌

希望能帮到你

于 2013-01-22T00:56:22.767 回答
0

事实上,这不起作用,因为令牌过期得很快。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的功能

于 2013-01-22T03:47:24.513 回答
0

当我使用 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 登录

于 2013-01-22T07:04:16.973 回答