CMS構築を目的にPHPをベースとしたWordPress、CakePHPやPEARなどオープンソースを中心に解説しています

FuelPHPのOpauthパッケージを利用してFacebookのログインにチャレンジしてみます

実証環境はPHP 7.0.15、FuelPHP 1.8です。

Facebookでアプリ登録

まず初めに、Facebookでのログインを実現するには、Facebookでアプリ登録をする必要があります。
開発者向けFacebook

ヘッダ右上の「アプリを作成」ボタンを押して、アプリ名など必要事項を入力します。
アプリ作成後、アプリIDとapp secretを取得し、控えておきます。また、アプリに接続可能なドメイン「アプリドメイン」を登録します。
※Facebookアプリ登録には、Facebookでの電話認証済み、または、クレジットカード認証済みであることが前提です。

また、必要に応じて、アプリのカテゴリ、規約URL、プライバシーポリシーURLやアプリアイコン画像などを設定しておくとよいでしょう。

Opauthパッケージのインストールと設定

Opauthパッケージのインストールはcomposerで実行します。

まず、FuelPHPがインストールされているルートディレクトリに移動して、composer.jsonを開いて、以下の内容を記述します。

"require": {
	"php": ">=5.3.3",
	"monolog/monolog": "1.5.*",
	"opauth/opauth": "0.4.*",
	"opauth/facebook": "dev-master",
	"fuelphp/upload": "2.0"
},


次に、composerをコマンドを実行して、パッケージをダウンロードします。

> php composer.phar self-update
> php composer.phar update

「/fuel/app/config/config.php」を開き、authパッケージを読み込むように設定を編集します。

...
'always_load'  => array(
	'packages'  => array(
		'auth',
		'orm',
	),
),
...

「/fuel/packages/auth/config/opauth.php」を「/fuel/app/config/opauth.php」にコピーし、以下の個所を編集します。

'security_salt' => '(任意の文字列を入力)',
'Strategy' => array(
	'Facebook' => array(
		'app_id' => '(先ほど取得したアプリID)',
		'app_secret' => '(先ほど取得したアプリapp secret)'
	),
),

インストールと設定は以上です。

ログイン処理

次にログイン処理の一連の流れを実装してみます。
任意のコントローラauthにログインアクションとなるloginを用意します。

public function action_login($provider = null){
	if ($provider === null){
		Response::redirect_back();
	}
	Auth_Opauth::forge();
}

処理に引数「$provider」は必須で、今回は「facebook」を指定します。
つまりFacebookにログインするパスは「http://helog.jp/auth/login/facebook/」となります。
Auth_Opauthがプロバイダを解釈し、Facebookのログイン画面へと移動します。

Facebookにログインしていない場合、Facebookへのログインが求められます。
また、このFacebookアプリへのアクセスが初めての場合、Facebookユーザ情報へのアクセス許可を求める画面が表示されます。
Facebookでの一連の処理を終えたら、コールバックで「http://helog.jp/auth/callback/」に結果が返されます。
「callback」はデフォルトですが、設定でコールバック先を変更することも可能です。

以下、コールバック後の判定処理です。

public function action_callback(){
	try{
		$opauth = Auth_Opauth::forge(false);
		$status = $opauth->login_or_register();
		switch($status){
			case 'linked':
				// 現在ローカルユーザでログイン済み
				// さらにFacebookユーザとの関連付け成功
			break;
			case 'logged_in':
				// 現在ローカルユーザで未ログイン
				// しかしFacebookユーザとの関連付けが成功したので
				// そのローカルユーザでログイン
			break;
			case 'register':
				// ローカルユーザとFacebookユーザとの関連見つからず
			break;
			case 'registered':
				// ローカルユーザとFacebookユーザとの関連見つからず
				// しかしFacebookユーザ情報が十分だったため
				// それを元にローカルユーザを作成して関連付ける
			break;
			default:
				// 状態を判定できず
		}
	}catch(OpauthException $e){
		// 認証失敗
	}catch(OpauthCancelException $e){
		// 認証失敗
	}
}

Facebook側でのログインが成功した場合に、関数「login_or_register()」でローカル認証にトライし、その結果「$status」を見ています。
「$status」は、ローカルユーザとしてログイン済みか否か、また、ローカルユーザとFacebookユーザは関連付けられているかで分岐しています。

つまり、この時点で関連付けられていれば、Facebookアカウントを利用したログインに成功したということになります。

まとめ

今回、Opauthを利用したFuelPHPベースのFacebookログイン機能の構築にチャレンジしました。

実際、ログインに成功しましたが、不安要素が1点あります。
それは、Facebook APIが日々バージョンアップしているのに対して、Opauthが4年ほど更新されていない事です。
現時点では問題ないかもしれませんが、これから先のFacebookのアップデートについていけるかが不安です。
実際に今回の検証の中でも、他のブログを参考にしたときに、ログイン後にユーザのメールアドレスが取得できずにパッケージを手動で調整するといった事例も見受けられました。

現在、Facebook公式からPHP SDKが公開され、アプリ開発環境も整理されつつあるので、これらも考慮するとあえてOpauthは採用しないというのも選択肢の一つかもしれません。

このエントリーをはてなブックマークに追加

Monthly Archives

Search