2014年5月25日日曜日

Facebook SDK for PHP ver.4.0 を使ってFacebookでログインする

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ファイルを作成し、以下の内容をペーストする。
{
  "require" : {
    "facebook/php-sdk-v4" : "4.0.*"
  }
}
バージョンはFacebook Developer 公式ドキュメントを確認し、適宜書き換える。


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) {
var_dump($_GET);
} else {
echo '<a href="'.$helper->getLoginUrl().'">Login with facebook</a>';
}
Facebookから認証コードをもらうために、一度Facebookにアクセスする。すると、FacebookRedirectLoginHelperで指定したURLにリダイレクトがかけられ、その際にGETで認証コードが送られてくる。var_dumpで["code"]の中に有効値が入っていれば取得に成功している。


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/');
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>';
}
先ほど取得したコードと諸々の情報持ってFacebookにアクセスすると、今度はアクセストークンを送り返してくれる。アクセストークンがあればFacebookの情報を自由に取得できる。var_dumpで["token"]の情報が入っていれば成功している。

自身の情報の取得と全ソースコード

<?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;
}

0 件のコメント:

コメントを投稿