通过 Javascript 和 PHP SDK 保护 Facebook 登录
Securing Facebook Login through Javascript and PHP SDK
我想要达到的目标
- Javascript 检查用户是否登录,如果登录,发送代码(access_token 或 signedRequest)到 PHP 以安全处理登录。
- PHP 将从 javascript 获取代码并使用 app_secret,将确保 javascript 给出的代码有效。
- 使用 PHP SDK 我想用 appsecret_proof 调用我所有的 Graph API 以便我可以在 FB 应用程序中打开 "require proof on all calls"。
我要去的地方
1) 我目前有 javascript 在页面加载时初始化,假设这个特定用户在这种情况下已登录并通过身份验证,然后我可以访问 $helper = new FacebookJavaScriptLoginHelper();
class,然后我可以在 PHP 中获取会话并进行调用,我还可以使用 $session = new FacebookSession('access token here');
直接传入访问令牌 - 太棒了!
2) 我有 PHP 的这个片段,它会检查 JS 响应的 signedRequest 属性,它会检查 app_secret - 太棒了!
$signed_request = $_POST['signedRequest'];
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$secret = "mysecret"; // Use your app secret here
// decode the data
$sig = base64_url_decode($encoded_sig);
$data = json_decode(base64_url_decode($payload), true);
// confirm the signature
$expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
if ($sig !== $expected_sig) {
return null;
}
//this is the oAuth code.
echo $data['code'];
哪里不清楚
我对我要实现的第 3) 点感到困惑。
我想使用
Secure Server-side Calls with appsecret_proof
以下使用 FB PHP SDK classes 的代码片段效果很好,它 不会发送 appsecret_proof。 (如果检查 2 的结果)为 null,我可以在那里烧掉脚本,这样就可以了。)
$helper = new FacebookJavaScriptLoginHelper();
$session = $helper->getSession();
$request = new FacebookRequest($session, 'GET', '/me');
$response = $request->execute();
$graphObject = $response->getGraphObject();
我可以 curl 将具有 appsecret_proof,但是使用 PHP SDK 是不可能的(那里更干净)。
curl \
-F 'access_token=<access_token>' \
-F 'appsecret_proof=<app secret proof>' \
-F 'batch=[{"method":"GET", "relative_url":"me"},{"method":"GET", "relative_url":"me/friends?limit=50"}]' \
https://graph.facebook.com
可能吧?
完成 2) 后,我应该 getLongLivedSession()
在 JS SDK 上短暂 access_token,然后 validate()
使用 Facebook\FacebookSession
命名空间。验证是否与我在 2) 中所做的相同?如果我那样做,我还能在 FB 应用程序中打开 'Require proof on all calls' 吗??
注意:如果您对我的问题投反对票,请解释原因,我仍然 none 更清楚为什么我的上一个问题被否决,因此我可以'改进。
首先,在设置->高级中,应用程序中有两个安全功能。
- 服务器 API 调用需要应用程序机密。虽然这没有明确完成,但您在此处输入应用程序密码 FacebookSession::setDefaultApplication(Appid, AppSecret),因此您的应用程序密码将通过所有服务器 api 调用发送。
- 服务器 IP 白名单 - 这将确保如果您的应用程序机密被泄露,仍然有人需要通过您的服务器发送呼叫(棘手!)。
其次,在代码方面我 运行 以下内容有助于确保安全:
- 我 运行 我在问题中提到的签入 2)。
- 我也使用 $session->validate() 方法。
- 然后我 $session-> 扩展访问令牌。
我相信这现在是安全的。
我想要达到的目标
- Javascript 检查用户是否登录,如果登录,发送代码(access_token 或 signedRequest)到 PHP 以安全处理登录。
- PHP 将从 javascript 获取代码并使用 app_secret,将确保 javascript 给出的代码有效。
- 使用 PHP SDK 我想用 appsecret_proof 调用我所有的 Graph API 以便我可以在 FB 应用程序中打开 "require proof on all calls"。
我要去的地方
1) 我目前有 javascript 在页面加载时初始化,假设这个特定用户在这种情况下已登录并通过身份验证,然后我可以访问 $helper = new FacebookJavaScriptLoginHelper();
class,然后我可以在 PHP 中获取会话并进行调用,我还可以使用 $session = new FacebookSession('access token here');
直接传入访问令牌 - 太棒了!
2) 我有 PHP 的这个片段,它会检查 JS 响应的 signedRequest 属性,它会检查 app_secret - 太棒了!
$signed_request = $_POST['signedRequest'];
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$secret = "mysecret"; // Use your app secret here
// decode the data
$sig = base64_url_decode($encoded_sig);
$data = json_decode(base64_url_decode($payload), true);
// confirm the signature
$expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
if ($sig !== $expected_sig) {
return null;
}
//this is the oAuth code.
echo $data['code'];
哪里不清楚
我对我要实现的第 3) 点感到困惑。
我想使用
Secure Server-side Calls with appsecret_proof
以下使用 FB PHP SDK classes 的代码片段效果很好,它 不会发送 appsecret_proof。 (如果检查 2 的结果)为 null,我可以在那里烧掉脚本,这样就可以了。)
$helper = new FacebookJavaScriptLoginHelper();
$session = $helper->getSession();
$request = new FacebookRequest($session, 'GET', '/me');
$response = $request->execute();
$graphObject = $response->getGraphObject();
我可以 curl 将具有 appsecret_proof,但是使用 PHP SDK 是不可能的(那里更干净)。
curl \
-F 'access_token=<access_token>' \
-F 'appsecret_proof=<app secret proof>' \
-F 'batch=[{"method":"GET", "relative_url":"me"},{"method":"GET", "relative_url":"me/friends?limit=50"}]' \
https://graph.facebook.com
可能吧?
完成 2) 后,我应该 getLongLivedSession()
在 JS SDK 上短暂 access_token,然后 validate()
使用 Facebook\FacebookSession
命名空间。验证是否与我在 2) 中所做的相同?如果我那样做,我还能在 FB 应用程序中打开 'Require proof on all calls' 吗??
注意:如果您对我的问题投反对票,请解释原因,我仍然 none 更清楚为什么我的上一个问题被否决,因此我可以'改进。
首先,在设置->高级中,应用程序中有两个安全功能。
- 服务器 API 调用需要应用程序机密。虽然这没有明确完成,但您在此处输入应用程序密码 FacebookSession::setDefaultApplication(Appid, AppSecret),因此您的应用程序密码将通过所有服务器 api 调用发送。
- 服务器 IP 白名单 - 这将确保如果您的应用程序机密被泄露,仍然有人需要通过您的服务器发送呼叫(棘手!)。
其次,在代码方面我 运行 以下内容有助于确保安全:
- 我 运行 我在问题中提到的签入 2)。
- 我也使用 $session->validate() 方法。
- 然后我 $session-> 扩展访问令牌。
我相信这现在是安全的。