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は採用しないというのも選択肢の一つかもしれません。
コメントする