Facebook Developer の公式ドキュメントがあまりにも不親切なチュートリアルしか用意していなかったので、実装にかなり手こずった。
今回はComposerを使うことで、SDKのダウンロードとnamespaceのルーティングを簡単にする。その後、ログインするPHPソースを作成する。※ 作業はドキュメントルート以下にプロジェクト用ディレクトリを作成し、その中で行っている。
※ Facebookのアプリケーション登録が完了していることを前提とする。Facebook Developer → Apps(登録したアプリ) → Settings と進んだところで「Website」というボックスの「Site URL」に今回作成するPHPファイルのURLを入力することを忘れずに。
1. プロジェクトルートにcomposer.pharを配置する
「公式サイト」からcomposer.pharをダウンロードする。私はすでにSymfony2をインストールする際に利用したものを持っていたので、それを移動させてきた。2. composer.jsonを作成する
composer.jsonファイルを作成し、以下の内容をペーストする。{バージョンはFacebook Developer 公式ドキュメントを確認し、適宜書き換える。
"require" : {
"facebook/php-sdk-v4" : "4.0.*"
}
}
3. Facebook SDK をインストールする
以下のコマンドを実行する。$ php composer.phar installこれでSDKのダウンロードとnamespaceのルーティングが完了した。
4. ログイン用PHPファイルを作成する
以降はこまめに動作確認を行いながらPHPソースを作成していく。SDKをインポートする
<?php
require 'vendor/autoload.php';
use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;
// 続くComposerが自動で作成したvendor/autoload.phpがSDKのクラス群をルーティングしてくれているので、いちいちrequire_onceでクラスをインポートしなくても使える。
Facebookから認証コードを取得する
// 続き
session_start();
FacebookSession::setDefaultApplication('アプリID', 'アプリSecret');
$helper = new FacebookRedirectLoginHelper('PHPファイルのURL');
if ($_GET) {Facebookから認証コードをもらうために、一度Facebookにアクセスする。すると、FacebookRedirectLoginHelperで指定したURLにリダイレクトがかけられ、その際にGETで認証コードが送られてくる。var_dumpで["code"]の中に有効値が入っていれば取得に成功している。
var_dump($_GET);
} else {
echo '<a href="'.$helper->getLoginUrl().'">Login with facebook</a>';
}
Facebookからアクセストークンを取得する
作成したPHPソースから以下を削除する。if ($_GET) {以下のソースを追記する。
var_dump($_GET);
} else {
echo '<a href="'.$helper->getLoginUrl().'">Login with facebook</a>';
}
$helper = new FacebookRedirectLoginHelper('http://centos.com/fb_connect_php/');先ほど取得したコードと諸々の情報持ってFacebookにアクセスすると、今度はアクセストークンを送り返してくれる。アクセストークンがあればFacebookの情報を自由に取得できる。var_dumpで["token"]の情報が入っていれば成功している。
try {
$session = $helper->getSessionFromRedirect();
} catch (FacebookRequestException $e) {
echo $e->getMessage();
exit;
} catch (\Exception $e) {
echo $e->getMessage();
exit;
}
if (isset($session)) {
var_dump($session);
} else {
echo '<a href="'.$helper->getLoginUrl().'">Login with facebook</a>';
}
自身の情報の取得と全ソースコード
<?php
require 'vendor/autoload.php';
use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;
session_start();
FacebookSession::setDefaultApplication('アプリID', 'アプリSecret');
$helper = new FacebookRedirectLoginHelper('PHPファイルのURL');
try {
$session = $helper->getSessionFromRedirect();
} catch (FacebookRequestException $e) {
echo $e->getMessage();
exit;
} catch (\Exception $e) {
echo $e->getMessage();
exit;
}
if (isset($session)) {
try {
$me = (new FacebookRequest(
$session, 'GET', '/me'
))
->execute()
->getGraphObject(GraphUser::className());
var_dump($me);
exit;
} catch (FacebookRequestException $e) {
echo $e->getMessage();
exit;
} catch (\Exception $e) {
echo $e->getMessage();
exit;
}
} else {
echo '<a href="'.$helper->getLoginUrl().'">Login with facebook</a>';
exit;
}