COLUMN

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

あるシステムから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にあります。