読者です 読者をやめる 読者になる 読者になる

きまブログ

5/31 はてなダイアリーから移行しました。


ユーザー認証 Authを学ぶ - Opauth編 (実践編)

FuelPHP

前回の準備編に続き、実践編です。
ユーザー認証 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で引っかかった時に、入力値を再設定してくれる。

link_provider()メソッド

データベースのuser_providerテーブルに、
ローカルアカウントとTwitterアカウントを紐付けするレコードを登録するメソッドですね。

所感

前回の更新から、およそ1ヶ月経ってしまいました。
これは、ボクの
・OAuthの仕様についての誤解
・Opauthの動作の不理解
FuelPHPの動作の不理解
・根本的にPHP5の不理解
などが重なるトコロで、時間が掛かってしまいました。。


次回、内容未定です。。良いお年を。