1

我正在开发一个基于 Phonegap 的应用程序,它使用 Facebook OAuth 进行 SSO 登录。如何在服务器端验证 FB.login javascript 响应?从 Facebook 手机成功重定向回我的应用程序后,我得到了 userId 和 accessToken。检查 accessToken 以获得服务器上用户的访问权限就足够了吗?

https://graph.facebook.com/me?fields=id&access_token=...

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

4

1 回答 1

0

使用 SignedRequest 而不是 accessToken 接缝是我需要的正确选择,例如 PHP 解决方案,使用应用程序机密。

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, '-_', '+/'));
}

见:https ://developers.facebook.com/docs/howtos/login/signed-request/

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

response.authResponse.signed_request
response.authResponse.signedRequest

而这个只包含“...”

response.authResponse.sig

任何人的想法?

编辑 好的 .sig 接缝仅由我的插件提供,硬编码:所以修复应该在那里https://github.com/davejohnson/phonegap-plugin-facebook-connect

但报道: https ://github.com/davejohnson/phonegap-plugin-facebook-connect/issues/245

于 2013-02-03T22:02:16.047 回答