13

朋友们,

我已经使用 JS SDK 为我的网站设置了 facebook 登录。

  1. 如果使用是通过JS SDK登录的,我们是否应该在服务器端交叉验证会话是否有效,因为客户端很容易被伪造。

  2. 由于我使用 JS SDK,服务器将无法访问 facebook 会话。如果我需要在服务器端验证会话,我可以像https://developers.facebook.com/docs/reference/php/中指定的那样使用 php-sdk 和 extern 会话吗?在这种情况下,我需要启用 CURL PHP 扩展以使其运行,并担心使用 php sdk 时性能是否会下降。

您能帮我找到上述问题的答案吗?

4

3 回答 3

14

php sdk 和 javascript 完全相反,正如 Julian H. Lam 所说,实际上它们是为一起使用而构建的。

php sdk 文档中,您可以找到以下内容:

与 Facebook SDK for JavaScript 集成

与 Facebook SDK for JavaScript 结合使用,PHP SDK 可以在客户端和服务器之间无缝共享用户会话。如果用户使用 Facebook 登录并授权您的应用程序,JavaScript SDK 可以获取用户会话并将其保存在 cookie 中,PHP SDK 无需开发人员的任何干预即可读取该 cookie。

要启用此功能,请确保在嵌入和初始化 JS SDK 时,将传递给 FB.init() 的对象的状态和 cookie 参数都设置为 true。

通过使用基本逻辑,这很有意义,在客户端,您可以创建侦听器来检索用户状态(如果他已登录,如果他已授予权限,如果他已注销),在服务器端执行此类操作不会一点意义都没有。

所以我对你的建议是使用 Javascript SDK 来处理用户事件,就像我之前提到的那样,并处理来自用户操作的响应,比如当用户点赞或使用提要对话分享帖子时等。使用 php SDK,您只需检查您是否有有效用户,因为在您使用 javascript SDK 处理登录过程后,您正在为客户端和服务器端共享相同的 cookie,如果您这样做$fb_id = $facebook->getUser()(当然在初始化 PHP SDK 之后),你会得到用户的 facebook id,现在你知道你有一个有效的用户,你可以使用 PHP SDK 来查询关于用户的信息,代表用户发帖等。

下面是正确加载带有 cookie 支持的 javascript SDK 的示例:

<div id="fb-root"></div>
<script>
  window.fbAsyncInit = function() {
    // init the FB JS SDK
    FB.init({
      appId      : 'YOUR_APP_ID',                        // App ID from the app dashboard
      channelUrl : '//WWW.YOUR_DOMAIN.COM/channel.html', // Channel file for x-domain comms
      status     : true,                                 // Check Facebook Login status
      xfbml      : true,                                  // Look for social plugins on the page
      cookie     : true
    });

    // Additional initialization code such as adding Event Listeners goes here
  };

  // Load the SDK asynchronously
  (function(d, s, id){
     var js, fjs = d.getElementsByTagName(s)[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement(s); js.id = id;
     js.src = "//connect.facebook.net/en_US/all.js";
     fjs.parentNode.insertBefore(js, fjs);
   }(document, 'script', 'facebook-jssdk'));
</script>

这是服务器端的一个简单代码,只是为了启发您:

require_once("facebook.php");

$config = array();
$config[‘appId’] = 'YOUR_APP_ID';
$config[‘secret’] = 'YOUR_APP_SECRET';
$config[‘fileUpload’] = false; // optional

$facebook = new Facebook($config);
try {
    $user_profile = $facebook->api('/me','GET');
    $user_name = $user_profile['name'];
    $user_email = $user_profile['email'];

} catch(FacebookApiException $e) {
    // If the user is logged out, you can have a 
    // user ID even though the access token is invalid.
    // In this case, we'll get an exception, so we'll
    // just ask the user to login again here.
}

PS:此服务器端代码,仅在用户已授予范围电子邮件权限时才有效

于 2013-04-09T14:43:28.147 回答
1

这个问题有两个部分:首先,UI流程有所不同。请参阅:https ://developers.facebook.com/docs/concepts/login/login-architecture/

1) 带有 JS SDK 的浏览器端。您从 oauth 2.0 对话框开始,获取访问令牌,然后使用它访问 Facebook API。

2) 服务器端使用signed_request 发布到服务器。有了这个,您可以提取 user_id。请参阅:https ://developers.facebook.com/docs/howtos/login/signed-request/ -

  • 第 1 步 - 描述 signed_request,如何从 PHP 或 JS SDK 获取它
  • 第 2 步 - 如何验证 signed_request 不是伪造的。

    来自其他提供商的 Oauth 令牌可以与 FB 集成。请参阅我的 Dropbox 示例:apps.facebook.com/fileglu/ - 大约 2011 年 9 月,还可以查看技术部分以了解实现细节,包括 CSRF、CORS 和避免 javascript 加密。

  • 于 2013-04-10T06:27:14.633 回答
    0

    Facebook javascript 库和 php SDK 本质上可以被认为是两个不相互通信的实体,一个是客户端,另一个是服务器端。

    php SDK 让您可以更精细地控制用户的登录会话,而 javascript 库更容易上手。

    通常,通过 javascript 库登录的用户不会在服务器端自动登录,尽管在某些情况下,可以将访问令牌从客户端发送到服务器端。但是,不建议这样做,因为这些数据可能会被截获。

    这个相关问题讨论了将访问令牌(从 JS 库中检索到的)发送到服务器端。

    在本质上:

    FB.login(function(response) {
        var access_token = response.authResponse.accessToken;
    
        // Make an ajax call here to your server-side, and send access_token in.
    });
    
    于 2013-04-05T12:57:54.010 回答