无需重定向的Facebook认证?

3
有没有一种方法可以使用Facebook身份验证(OAuth 2.0)而不进行重定向?
我没有使用Facebook登录按钮,所以我应该重定向到https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL,但我不想将我的用户重定向到我的页面之外。有没有一种方法可以在弹出窗口中打开此URL(顺便问一下,我该如何做?),然后像使用普通的Facebook登录按钮一样捕获sessionChange事件? 我正在使用jQuery和Pyramid。
谢谢!
2个回答

2

几周前,我使用Facebook JS SDK为客户制作了一个应用程序,并实现了这种行为。

FB.login(function(response){
        if(response.session){
        var user_id = response.session.uid,
            access_token = response.session.access_token;
        }
    }
);

你可以使用ajax将access_token发送到服务器。但是如果你使用太多的ajax,会话将在一段时间后过期,如果不经常调用FB.getLoginStatus()。

它是通过弹出窗口完成的。这意味着你只能在用户操作(如点击事件)中调用它,否则浏览器可能会阻止它。 - Paul
谢谢!我有一个使用Facebook认证的Pyramid应用程序。 我了解到有两种类型的Facebook用户认证 - 客户端和服务器端。目前我只使用客户端,因为仅在js中访问用户数据对我来说是可以的。 我在考虑安全性,不确定这是否足够强大。我的网站包含一个由已登录用户提交的表单。由于我无法进行服务器端登录状态检查,任何人都可以通过简单操作js而提交表单,即使未登录,对吗? 服务器端身份验证是唯一的选择吗? - Raiders
2
@Raiders 服务器端检查会更加安全。我不确定在Pyramid中如何实现,但基本上我在FB.login()之后使用ajax发送user_id和access_token到服务器。然后我在服务器端使用cURL向https://graph.facebook.com/me?access_token='access_token_from_ajax'发送请求,并验证返回的user_id是否与我从ajax获取的user_id匹配。 - Paul

2

您可以检查用户是否具有有效的访问令牌,换句话说,是否曾经登录过您的站点。FB会在前端提供会话数据,因此请像这样获取它:

    FB.getLoginStatus(function(response){
        //send the response to the back end in a json string
    });

然后使用修改过的传统签名验证的后端对其进行验证。看起来它是有效的。如果我漏掉了什么,请告诉我。 它只告诉您用户ID和访问令牌是否与您的站点匹配。不需要curl调用。 但它并不告诉您会话是否实际上当前有效,因此不要依赖它来进行银行系统或任何其他事情的验证。

function validateFB_sessionObj($sessionObj){//pass me the session data object
   $sessionObj = $sessionObj->session;
   global $fb;//pull in the secret fb keys
   if (!is_object($sessionObj) || !isset($sessionObj->uid) || !isset($sessionObj->access_token) || !isset($sessionObj->sig)){
//       warning("facebook session object is lacking something", $sessionObj);
       return false;
   }
   $expectedSig = generateSig($sessionObj, $secret);
   if ($sessionObj->sig = $expectedSig){
     //  status("fb signature looks good");
       return true;
   } else {
    //   warning("facebook signature looks wrong", $sessionObj);
       return false;
   }
}

function generateSig($params, $secret){
   $string = $params->access_token . $params->uid . $secret;
   return md5($string);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接