opauthライブラリを使用してFacebook認証を実装する手順をメモ

[FuelPHP]opauthライブラリで速攻SNS認証(Twitter,Facebook,Google etc)で投稿しているopauthライブラリの実装方法について。

opauthはPHPのフレームワーク毎にパッケージ化されており、FuelPHPも既にパッケージ化されている。

https://github.com/andreoav/fuel-opauth

※バグ改修、コードリファクリングで何度か更新されているっぽい

一度大元となるFuelPHPのopauthパッケージをプロジェクトに導入すると、あとは各ストラテジのファイルを入れ込むだけで簡単に各種SNS認証が導入できる。

2013/1現在のFuelPHPのopauthパッケージには、既にFacebook,Twitterの二つのストラテジは入れ込まれている。

今回はとりあえずFacebookの認証を動くところまで試す。取り込み手順はREADMEのHow to use の4手順。

プロジェクトフォルダ(プロジェクト名)は「basedemo」としてローカル環境で試す

導入手順 ※導入はおよそ10分程

手順1.Facebook管理者ページの設定

Facebook開発者ページからアプリ登録を行い、「App ID」「App Secret」を取得する。

https://developers.facebook.com/apps

[Facebookでログインするウェブサイト]の[Webサイト]には手順5で作成するController_AuthクラスのAction_Loginメソッドにストラテジ文字列を引数としたアドレスがログインページとなるので以下のようにする。

http://[サイトパス]/auth/login/facebook/

※ローカル環境の実行の場合はlocalhostで問題なし

今回は「http://localhost/basedemo/auth/login/facebook/」を設定する

この[Webサイト]パスを間違えると下記のようなエラーが出るので注意

—————————————————————————————————————————————
API Error Code: 191
API Error Description: The specified URL is not owned by the application
Error Message: Invalid redirect_uri: 指定されたURLは、アプリケーションの設定で許可されていません。
—————————————————————————————————————————————

手順2.プロジェクトにopauthライブラリをgitからclonesで取り込む ※How to use の1


cd basedemo/fuel/packages/
git clone git://github.com/andreoav/fuel-opauth.git opauth

※zipファイルでダウンロードしてフォルダをパッケージ配下に配置しても同様

 

手順3.opauth.php設定ファイルの作成 ※How to useの2

opauth/config/opauth.phpをbasedemo/fuel/app/config/にコピーする ※新規作成でも良い

<?php
'path' => '/basedemo/auth/login/',
'security_salt' => 'testtesttest', // デフォルトで設定されている値と違うものにする ※同じ場合動作しない
'callback_url' => '/basedemo/auth/callback/',
'Strategy' => array(
'Facebook' => array(
'app_id' => 'APP_ID', // 手順1で取得した「App ID」の値を設定
'app_secret' => 'APP_SECRET' // 手順1で取得した「App Secret」の値を設定
),
),

security_saltはデフォルトと違う値かどうかをコード上チェックしているため、別の適当な値を設定すること。

今後ストラテジを追加する場合にはFacebookと同様に追加して記載する。

Twitterの場合:


'Twitter' => array(
'key' => 'KEY',
'secret' => 'SECRET'
),

pathとcallback_urlについてはサイト直下に作成している場合は「How to useの2」に記載されている通りpath[/auth/login/]、callback_url[/auth/callback/]でいいが、今回はlocalhost直下ではなくlocalhost/basedemoなので[/basedemo]を付け忘れないこと。今回ここで4時間ぐらい無駄にハマった・・・

それぞれController_AuthクラスのAction_Authメソッド、Action_Callbackメソッドを呼び出している。

 

手順4.config.phpの設定 ※How to useの3

opauthをパッケージとして読み込む設定をする

<!--?php 'always_load' =--> array(
'packages' =&gt; array(
'opauth',
),
),

 

手順5.コントローラファイルの作成 ※How to useの4

auth.phpを[/fuel/app/classes/controller]へ新規作成する
あとは「How to useの2」のコードをそのままコピペ

<!--?php class Controller_Auth extends Controller {     private $_config = null;     public function before()     {         if(!isset($this--->_config))
{
$this-&gt;_config = Config::load('opauth', 'opauth');
}
}

/**
* eg. http://www.exemple.org/auth/login/facebook/ will call the facebook opauth strategy.
* Check if $provider is a supported strategy.
*/
public function action_login($_provider = null)
{
if(array_key_exists(Inflector::humanize($_provider), Arr::get($this-&gt;_config, 'Strategy')))
{
$_oauth = new Opauth($this-&gt;_config, true);
}
else
{
return Response::forge('Strategy not supported');
}
}

// Print the user credentials after the authentication. Use this information as you need. (Log in, registrer, ...)
public function action_callback()
{
$_opauth = new Opauth($this-&gt;_config, false);

switch($_opauth-&gt;env['callback_transport'])
{
case 'session':
session_start();
$response = $_SESSION['opauth'];
unset($_SESSION['opauth']);
break;
}

if (array_key_exists('error', $response))
{
echo '<strong style="color: red;">Authentication error: </strong> Opauth returns error auth response.'."
\n";
}
else
{
if (empty($response['auth']) || empty($response['timestamp']) || empty($response['signature']) || empty($response['auth']['provider']) || empty($response['auth']['uid']))
{
echo '<strong style="color: red;">Invalid auth response: </strong>Missing key auth response components.'."
\n";
}
elseif (!$_opauth-&gt;validate(sha1(print_r($response['auth'], true)), $response['timestamp'], $response['signature'], $reason))
{
echo '<strong style="color: red;">Invalid auth response: </strong>'.$reason.".
\n";
}
else
{
echo '<strong style="color: green;">OK: </strong>Auth response is validated.'."
\n";

/**
* It's all good. Go ahead with your application-specific authentication logic
*/
}
}

return Response::forge(var_dump($response));
}
}

 

動作確認

「http://localhost/basedemo/auth/login/facebook/」を実行してfacebookのログインページに遷移すればOK。あとはログインして完了すると「OK: Auth response is validated.」が表示されれば成功。
画面上はfacebookからのレスポンス情報が表示されているはず。

 

最後に・・・

単に配置しただけで認証のみは簡単に行えた。あとはDBに情報格納やらプロジェクトにあったコールバック処理、遷移に変えればよさそう。

その他ストラテジの追加は下記公式サイトよりストラテジファイルをダウンロードして配置して、config設定を行い多少修正すれば、おそらくすぐに実装が可能。

公式サイト:http://opauth.org/

 

あれ、ログアウト処理ないね。。セッション値を削除すればいいかな。

 

その他おすすめの備忘録

Tagged with:
 

2 Responses to [FuelPHP]opauthライブラリでFacebook認証を速攻実装する

  1. keach より:

    opauthライブラリを使用してFacebook認証を実装する手順をメモ [FuelPHP]opauthライブラリで速攻SNS認証(Twitter,Facebook,Google etc)で投稿しているopauthライブラリの実装方法について。 via Pocket

  2. Yoji Ueda より:

    [FuelPHP]opauthライブラリでFacebook認証を速攻実装する | Memorandum blog – http://to-developer.com/blog

コメントを残す