Written by Manabu Bannai

【PHP】Facebookログインして、その情報をMysqlに保存する方法【SDK5】

PHP PROGRAMMING

FacebookのSDK5を使ってFacebookログイン機能を作りました。PHP7で動くスクリプトですので、なういエンジニアの方は是非ご利用ください。備忘録代わりに記事としてまとめました。
» コードのDLはこちら

※更新情報(2016/11/8)
FacebbokのSDKが更新されたので、最新情報は下記記事をご覧ください。Mysql保存部分はこの記事の方法で動きます。
» 【2016年11月更新】facebook/graph-sdkの使い方【PHPでFBログイン】

DB作成

CREATE DATABASE fb_login DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE fb_login. users (
    id int(11) NOT NULL AUTO_INCREMENT,
    fid varchar(100) NOT NULL,
    name varchar(255) NOT NULL,
    email varchar(255) NOT NULL,
    photo text  NOT NULL,
    PRIMARY KEY (`id`)
);

Facebookアプリ作成

Facebookアプリを作成しましょう。登録の流れは、下記記事がわかりやすいかと思います。
» Facebookシェアのサンプルアプリを作成する-準備編- – Qiita

Facebook SDKをComposerでインストールする

新規作成ファイル:composer.json
FacebookログインにはSDKというパッケージを利用します。PHPのComposerを使ってインストールしましょう。尚、「Composerってなにそれ」って方はcomposerとはをさらっと読んでおきましょう。

ルートディレクトリに「composer.json」を作成します。
ファイルには下記のとおりに記載してください。


{
  "require" : {
    "facebook/php-sdk-v4": "~5.0"
  }
}

その後、ターミナルから、下記のようにコンポーザーをアップデートします。

$ composer update

すると下記のメッセージが出くるはず。出てくれば完了です。


Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing facebook/php-sdk-v4 (5.2.0)
    Downloading: 100%         

facebook/php-sdk-v4 suggests installing guzzlehttp/guzzle (Allows for implementation of the Guzzle HTTP client)
Writing lock file
Generating autoload files

トップページを作成する

新規作成ファイル:index.php
コメントかなり多めにしました。
参考:PHP用Facebook SDKの使用説明
参考:facebookでテスト用アプリの作り方

<?php
session_start();
 
// composerで生成されたオートロドファイル読み込み
require_once( 'vendor/autoload.php' );
 
// DBと接続
require_once( 'dbconnect.php' );
 
// Facebookログインしたユーザー情報をDBに保存するPHPスクリプト
require_once( 'checkuser.php' );
 
// 訪問者がすでにFacebookログインしているかどうかを確認
if (isset($_SESSION['facebook_access_token'])) {
 
 	try {
		// このあたりはFacebookディベロッパーマニュアルをほぼコピペしただけです
		// 参考: https://developers.facebook.com/docs/php/gettingstarted
		$response = $fb->get('/me');
		$user = $response->getGraphObject();

		// $responseの部分がうまく動かなかったら下記もお試しください。
		// $response = $fb->get('/me?fields=id,email,gender,link,locale,name,timezone,updated_time,verified,last_name,first_name,middle_name', $_SESSION['facebook_access_token']);


	} catch(FacebookExceptionsFacebookSDKException $e) {
		exit;
	}

	// 下記のような感じで情報を取り出せます。
	$fid = $user['id']; // ID
	$fname = $user['name']; // 名前
	$femail = $user['email'];// Email
	$fphoto = "http://graph.facebook.com/" . $user['id'] . "/picture?type=large"; // 顔写真のURL
 
	echo $fid;
	echo $fname;
 
	// ログイン済み、かつ新規ユーザーの場合は、DBに会員情報を保存する関数読み込み
	checkuser($fid, $fname, $femail, $fphoto, $mysqli); ?>
 
	<p>ログインしました</p>
	<a href="logout.php">ログアウトはこちら</a>
 
<?php } else {
	// ログインしていないユーザーには、Facebookログインリンクを表示する
	// このあたりはFacebookディベロッパーマニュアルをほぼコピペしただけです
	$helper = $fb->getRedirectLoginHelper();
	$permissions = ['email', 'user_likes'];
 
	// 下記のURL部分を環境にあわせて変更してください
	$loginUrl = $helper->getLoginUrl('ここにURLを記入/login-callback.php', $permissions);
	echo '<a href="' . $loginUrl . '">Facebookでログインする</a>';
}

login-callback.phpはコピペでOK。

新規作成ファイル:login-callback.php
login-callback.phpとかはFacebookの仕様に沿ってかいているだけです。公式マニュアルは分かりづらかったので海外サイトを参考にしました。
How to Login with Facebook API SDK v5 in PHP | PHP Gang – Tutorial Programming Blog | Programmers Demo Download Free

<?php
session_start();
require_once( 'vendor/autoload.php' );
require_once( 'core/config.php' );

// このあたりはFacebookの仕様に沿って書いたものです
// 公式マニュアルは分かりづらいので下記記事がおすすめです。
// http://www.phpgang.com/how-to-login-with-facebook-api-sdk-v5-in-php_2879.html
$helper = $fb->getRedirectLoginHelper();

try {
	$accessToken = $helper->getAccessToken();
} catch(FacebookExceptionsFacebookResponseException $e) {
	// When Graph returns an error
	echo 'Graph returned an error: ' . $e->getMessage();
	exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
	// When validation fails or other local issues
	echo 'Facebook SDK returned an error: ' . $e->getMessage();
	exit;
}

if (isset($accessToken)) {
	// Logged in!
	$_SESSION['facebook_access_token'] = (string) $accessToken;
} elseif ($helper->getError()) {
	// The user denied the request
}

header('Location: index.php?=new');

以上で解説おわり。
省略した部分も多いですが、たぶん理解できたのではないでしょうか。質問などはTwitterからお願いします。