あるシステムからFacebookのユーザー情報、FacebookページのフィードなどのFacebookに関連したデータを取得、投稿するにはGraph APIを利用します。
ユーザー名やページフィードの情報はユーザーの承認なしで取得できますが、
ユーザーのメールアドレスの取得や、ページへの投稿にはユーザーの承認が必要です。
api利用時にユーザーに承認されていることを示すアクセストークンを送ることによって、パーミッションの必要なデータに
アクセスすることが可能になります。
サーバーサイドのシステムからアクセストークンを取得する方法を説明します。
まずはユーザーにパーミッションを許可してもらうためのダイアログを表示させます。
https://www.facebook.com/dialog/oauth のurlへ各種パラメーターをセットし、リダイレクトさせることで
任意のダイアログをユーザー画面に表示させることができます。
メールアドレスのパーミッションのダイアログを表示させて、その結果を'https://realid-inc.com/test_system/'に返すサンプルコードです。
$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF対策 $my_url = 'https://realid-inc.com/test_system/' $dialog_url = "https://www.facebook.com/dialog/oauth" ?client_id=" . $app_id //登録したアプリのID . "&redirect_uri=" . urlencode($my_url) . "&state=" . $_SESSION['state'] //CSRF対策 . "&ecope=email"; //取得したいパーミッション(カンマ区切りで複数指定可能)
上記のパーミッションがユーザーに許可されると、指定したurlにcodeが付加されてリクエストされます。
このcodeを'https://graph.facebook.com/oauth/access_token'へ送ることでアクセストークンが取得できます。
codeを取得したプログラムでアクセストークンを取得するサンプルコードです。
//指定したstateの値を確認することでCSRF攻撃を防ぎます if($_SESSION['state'] && ($_SESSION['state'] === $_REQUEST['state'])) { $token_url = "https://graph.facebook.com/oauth/access_token?" . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&client_secret=" . $app_secret . "&code=" . $_REQUEST["code"]; $response = file_get_contents($token_url); $params = null; parse_str($response, $params); } else { echo("CSRFの犠牲になったかもしれません"); }
上記の方法で取得したアクセストークンをAPI利用時に送ることで目的のデータを得ることができます。
$graph_url = "https://graph.facebook.com/me" . "?access_token=" . $params['access_token'] . "&fields=email"; $user = json_decode(file_get_contents($graph_url)); echo($user->email);
詳細は公式ドキュメントのLogin for Server-side Appsにあります。