Real Blog

レジェンド鈴木が日々感じたことを哲学するブログ。書評、エッセイ、ポエムも書いてます。

Facebookアプリでアクセストークンを取得する方法

あるシステムからFacebookのユーザー情報、FacebookページのフィードなどのFacebookに関連したデータを取得、投稿するにはGraph APIを利用します。

ユーザー名やページフィードの情報はユーザーの承認なしで取得できますが、 ユーザーのメールアドレスの取得や、ページへの投稿にはユーザーの承認が必要です。
api利用時にユーザーに承認されていることを示すアクセストークンを送ることによって、パーミッションの必要なデータに アクセスすることが可能になります。

サーバーサイドのシステムからアクセストークンを取得する方法を説明します。

まずはユーザーにパーミッションを許可してもらうためのダイアログを表示させます。
https://www.facebook.com/dialog/oauth のurlへ各種パラメーターをセットし、リダイレクトさせることで 任意のダイアログをユーザー画面に表示させることができます。
メールアドレスのパーミッションのダイアログを表示させて、その結果を'http://realid-inc.com/test_system/'に返すサンプルコードです。

$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF対策
$my_url = 'http://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にあります。