前回の準備編に続き、実践編です。
ユーザー認証 Authを学ぶ - Opauth編 (準備) - きまブログ
普通「Twitterでログイン」というと、
Twitterで認証がとれれば、そのサービスが使える
(正確には、そのサービスにデータを使わせてあげる)
イメージですが、FuelPHP公式サイトで提示されているサンプル
(Opauth Controller example - Auth Package - FuelPHP Documentation)は、それだけではなく、
ローカルアカウントとTwitterアカウントを紐付けすることで、認証完了。
というスタンスみたい。
このサンプルの正攻法(正常系)のステップは、
・(前回作ったサンプルで)ローカルアカウントを登録する。
・(前回作ったサンプルで)ローカルアカウントでログインする。
・(今回追加したサンプルで)Twitterでログインする。
→ ローカルアカウントとTwitterアカウントがひも付けされる。
めでたく、サービスが使える。
それを踏まえて、サンプルコードの動作フローと修正する点を中心に
メソッドごとに見ていきます。
action_oauth()メソッド
このメソッドで、引数$provider(例えば twitter)があれば、
opauthのインスタンスを作成し、TwitterへのOAuth認証処理をしてくれます。
opauthの処理
\Auth_Opauth::forge();
により、/fuel/packages/auth/classes/auth/opauth.php の、forge()が実行されます。
この最後に、new static() を実行しているので、
__construct() マジックメソッド内で new \Opauth() が実行されます。
これで、
/fuel/vendor/opauth/opauth/lib/Opauth/Opauth.phpの、
Opauth()がインスタンス化され、
run()メソッド → CallAction()メソッド → TwitterStrategyクラスから new tmhOAuth()
という順に実行され、
具体的なTwitter認証が実行されます。(と思いますw)
themattharris/tmhOAuth · GitHub
のラッパー的な感じ。(tmhOAuthはTwitter1.0a対応。)
とにかく、「Opauth」というキーワードがたくさんあるので、
実際にどのクラスが動いているのかは、注意しないとわからなくなってしまう。。
action_callback()
これは、最終的にTwitterでの認証に成功した場合に実行されます。
Opauthのデフォルトだと思います。
じゃあ、Twitterに登録するCallback関数は?
実は、Twitterにアプリを登録する段階でCallback URLをなんとなく登録しておきますが。。
入力フィールドの下部に、こんなメッセージが書いてあります。
Where should we return after successfully authenticating?
認証終了後にリターンするのはどこか?
OAuth 1.0a applications should explicitly specify their oauth_callback URL on the request token step, regardless of the value given here.
OAuth1.0aアプリはトークンを要求するステップで、oauth_callback URLを明確に指定すべきで、ここで与えられた値は無視する。
To restrict your application from using callbacks, leave this field blank.
君のアプリでコールバック利用を制限するなら、このフィールドはブランクにしておけ。
とあります。OAuth1.0aを使う場合、ここに書いたURLは無効の模様。
でも、この action_Callback() は実行されるし。。
OAuth認証するためには、どこかにコールバックされなきゃならないんだけど。。
たぶん、認証のために本当にTwitterからコールバックされるのは、
/fuel/packages/auth/classes/auth/opauth.php にある callback()メソッド だと思う。。
ナゾの _()
サンプルコードにたびたび登場する _() ですが、
Langのページに、Lang::getの別名。とあります。
Lang - クラス - FuelPHP ドキュメント
Lang - クラス - FuelPHP ドキュメント
言語ファイルから、指定した識別子に対応するメッセージを取得します。
とりあえず、_()を外して、識別子をそのまま表示するように修正します。
ナゾの Messages::
なにも考えずに実行してみると、エラーになります。
Auth コントローラの例 - Auth パッケージ - FuelPHP ドキュメント
に、以下のような事が書いてあります。
application 構成ファイルやアプリケーションでのメッセージを扱う Message クラス、 それらは完全にこの例の範囲外です。
とあるので、Session::success() もしくは error() などに、適当に置き換えておきます。
action_register()メソッド
login_or_register()メソッド
ローカルアカウントとTwitterアカウントを紐付けするキーになるメソッド。
このメソッドの返り値(linked, logged_in, register, registerd)を評価し、
その後の動作を swtich-case で分岐します。
add_model()メソッド
フィールドを追加します。
ここでは、
/fuel/packages/auth/classes/model/auth/user.phpで定義されている、
$_properties = array(id, username, email, group, group_id, password, profile_fields, last_login, previous_login, login_hash, user_id, created_at, updated_at)
が追加されます。
group, profile_fieldsは、_init()で、ormauth利用の場合にunsetされていて、追加されません。
idは、配列じゃないんで追加されないのかな?
結果、以下の、10コのフィールドが追加されます。
- username #27
- email #28
- group_id #29
- password #30
- last_login #31
- previous_login #32
- login_hash #33
- user_id #34
- created_at #35
- updated_at #36
-
-
- -
-
-
以下の2つは、手動で追加しています。
- fullname #37
- confirm #38
populate()メソッド
初期値の設定
repopulate()メソッド
validationで引っかかった時に、入力値を再設定してくれる。
所感
前回の更新から、およそ1ヶ月経ってしまいました。
これは、ボクの
・OAuthの仕様についての誤解
・Opauthの動作の不理解
・FuelPHPの動作の不理解
・根本的にPHP5の不理解
などが重なるトコロで、時間が掛かってしまいました。。
次回、内容未定です。。良いお年を。