まず、アクセストークンをCookieに保存したり、ajax呼び出しを介して送信したりしないでください。アクセストークンは、常に非表示にする必要がある賢明なデータです。
これを行うのに最適な方法かどうかはわかりませんが、常にsignedRequestを使用しています。これは、誰も知らないアプリの秘密で暗号化されているため、サーバーに送信するための安全なデータです...
(FB JS SDKからの)signedRequestをサーバーに渡すと、有効なアクセストークンを取得できます。PHPでは、POSTによってsignedRequestを渡すと仮定すると、次のようになります。
$signed_request = $_POST['signedRequest'];
$data = parseSignedRequest($signed_request);
$token_url= 'https://graph.facebook.com/oauth/access_token?' .
'client_id=' . YOUR_APP_ID .
'&redirect_uri=' . // when using the JS signedRequest, leave this blank
'&client_secret=' . YOUR_APP_SECRET .
'&code=' . $data["code"];
$response = file_get_contents($token_url);
$params = null;
parse_str($response, $params);
$access_token = $params['access_token']; // here is your access token
次の関数が必要になります。
function parseSignedRequest($signed_request) {
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
// decode the data
$sig = base64UrlDecode($encoded_sig);
$data = json_decode(base64UrlDecode($payload), true);
if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
return 'Unknown algorithm. Expected HMAC-SHA256';
}
// check sig
$expected_sig = hash_hmac('sha256', $payload, YOUR_APP_SECRET, $raw = true);
if ($sig !== $expected_sig) {
return 'Bad Signed JSON signature!';
}
return $data;
}
function base64UrlDecode($input) {
return base64_decode(strtr($input, '-_', '+/'));
}
もちろん、アクセストークンをDBに保存する場合は、これを通過する必要はありませんが、トークンの有効期限に注意してください。
ユーザーがすでにアプリを承認していてFacevookにログインしている場合は、CookieからsignedRequestを取得できますが、$_COOKIE[('fbsr_' . YOUR_APP_ID)]
このデータはあまり信頼していません...