Facebook 如何在服务器端的移动应用程序中验证FBLogin

Facebook 如何在服务器端的移动应用程序中验证FBLogin,facebook,facebook-graph-api,cordova,Facebook,Facebook Graph Api,Cordova,我正在开发一个基于Phonegap的应用程序,它使用FacebookOAuth进行SSO登录。如何在服务器端验证FB.login javascript响应?成功地从Facebook手机重定向回我的应用程序后,我获得了用户ID和accessToken。检查accesToken是否足以让用户访问服务器 https://graph.facebook.com/me?fields=id&access_token=... 我的问题是移动和web上的JS和PHP混合: 用户在移动Javascript

我正在开发一个基于Phonegap的应用程序,它使用FacebookOAuth进行SSO登录。如何在服务器端验证FB.login javascript响应?成功地从Facebook手机重定向回我的应用程序后,我获得了用户ID和accessToken。检查accesToken是否足以让用户访问服务器

https://graph.facebook.com/me?fields=id&access_token=...
我的问题是移动和web上的JS和PHP混合:
用户在移动Javascript上使用FB.login并成功返回客户端,因为用户已经通过web连接。现在我可以检查数据库中的FB id,通过AJAX请求加载用户凭据。如何使AJAX请求安全。原型将登录通过有效FB的每个人,该FB也存在于我的DB中。因此,系统是开放的,无需在FB服务器上重新验证即可获得会话。我的想法是检查accessToken是否有效,但不确定这是否足够。。。我想不是。。。也可以检查IP吗?

使用SignedRequest而不是accessToken seams是适合我需要的正确选择,例如PHP解决方案,使用app secret

private function check_signed_request($signed_request) {

    $secret = Semods_Utils::getSetting('socialdna.facebook_secret','');
    list($encoded_sig, $payload) = explode('.', $signed_request, 2);

    // decode the data
    $sig = $this->base64_url_decode($encoded_sig);
    $data = json_decode($this->base64_url_decode($payload), true);

    if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
        throw new Exception('Unknown algorithm. Expected HMAC-SHA256');
    }

    // Adding the verification of the signed_request below
    $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
    if ($sig !== $expected_sig) {
        throw new Exception('Bad Signed JSON signature!');            
    }

    return true;
}

private function base64_url_decode($input) {
    return base64_decode(strtr($input, '-_', '+/'));
}
见:

问题 我没有收到签名的_请求,这些未定义:

response.authResponse.signed_request
response.authResponse.signedRequest
而这个只包含

response.authResponse.sig
有人有主意吗

编辑 好的。sig seam只由我的插件提供,硬编码:所以修复应该在那里

但据报道:

我假设您正在谈论访问FB上的用户信息?如果是这样,根据您从用户请求的权限,您可以使用访问令牌从FB检索授予的信息。希望在访问令牌有效之前有所帮助。如果我的问题不够清楚,我将对其进行编辑。请注意,移动SDK不提供签名请求,可以使用acces_令牌: