TOP情報セキュリティ> 第3回:IdPサンプルでログイン機能を実装 (2/3)

使って広がるOpenIDの輪

使って広がるOpenIDの輪

第3回:IdPサンプルでログイン機能を実装

著者:はてな  水野 貴明

公開日:2007/12/20(木)

サンプルの中をみてみよう

では、サンプルの中身をのぞいてみましょう。server.phpの仕組みは非常にシンプルです。まず、getActionという関数を呼び出しています。この関数は、アクセスされたURLによって、実行すべき関数を返してくれるものです。また、この関数はサンプルのlibディレクトリ内のsession.phpで定義されています。

この仕組みは簡単なもので「server/server.php/sites」のようなURLにアクセスされたら「action_sites」という関数、というように「server.php」の後ろについている文字列から関数を生成しています。

これはサンプルのログインシステムなどで利用されており、OpenIDの認証自体の場合はgetActionで正しい関数は生成されず、結果として「action_default」がセットされます。実行する関数がわかったら、後はそれを実行し、結果を$respという変数に入れ、続いて画面を描画するwriteResponseという関数を呼び出します。

action_defaultは、libディレクトリ内のactions.phpで定義されています。そこでは、まずgetServer関数(session.php)を呼び出し、Auth_OpenID_Serverクラスのインスタンスを取得します。

Consumer、IdPとエンドユーザのやりとりはクエリパラメータやPOSTのメッセージボディを介して行われることは前回解説しました。このため、まず渡されたパラメータをAuth_OpenID_ServerクラスのdecodeRequestというメソッドに渡します。このメソッドはパラメータを解析し、それぞれの処理に応じたハンドラクラスを返してくれます。

サンプルでの認証処理の流れ
図2:サンプルでの認証処理の流れ
(画像をクリックすると別ウィンドウに拡大図を表示します)

OpenIDでIdPが対応すべきリクエストとして「associate」「checkid_immediate」「checkid_setup」「check_authentication」の4つがあります。そして、「associate」なら「Auth_OpenID_AssociateRequest」のように、それぞれにクラスが割り当てられているのです。

それぞれのモードはopenid.modeというパラメータで区別がつけられますが、返されるハンドラにおいても、modeプロパティにそれぞれの名前が入っているので区別がつきます。

ハンドラクラスの取得後のaction_defaultの処理は、modeごとに分岐します。modeが「checkid_immediate」か「checkid_setup」の場合、実際の認証処理を行います。

「checkid_setup」は認証時にページ遷移を伴うパターンです。「checkid_immediate」はJavaScriptなどを用い、ページ遷移なしにアクセスを行います。どちらの場合も、まずは渡されてきた認証すべきルートURLである「trust_root」が、すでに「信頼できる」かどうかをチェックします。

「信頼できる」というのは、setup.phpで「Trusted sites」に追加されていたり、認証時の確認の際に「Remember this decision」にチェックを入れるなどして、サーバ側に記録されているケースです。チェックはisTrusted関数(session.php)で行われています。

もし「信頼できる」場合は、ハンドラクラスのanswerメソッドを呼び出します。この場合、サーバの返答を保持するAuth_OpenID_ServerResponseクラスのインスタンスを生成します。その際に「true」を渡せば成功、「false」を渡せば失敗の返答になります。

「信頼できる」状態でない場合の処理は「checkid_immediate」と「checkid_setup」で異なります。「checkid_immediate」だった場合は、即座に処理を失敗させます(falseを指定してanswerメソッドを呼び出します)。しかし「checkid_setup」の場合は、ログイン済み(getLoggedInUser関数でチェックしています)ならtrust_render関数が、ログインしていないならlogin_render関数が、呼び出されます。

これらはそれぞれ「このURLを認証してもいいですか?」と聞くページ、およびログインページを生成するための関数で、「lib」の「render」ディレクトリ内にある「trust.php」と「login.php」にそれぞれ定義されています。画面に表示するメッセージもすべてここで定義されており、書き換えることで簡単に日本語化することができます。

上記で説明した以外のmodeである「associate」「check_authentication」の場合は、Auth_OpenID_ServerのhandleRequestを呼び出します。なお、実際にはmodeごとにopenid_associateやopenid_check_authenticationというメソッドを呼び出しています。これらのメソッドがアソシエーションハンドルの発行や共有暗号鍵のチェックを行っています。 次のページ


前のページ  1  2  3  次のページ


株式会社はてな 水野 貴明
著者プロフィール
株式会社はてな  水野 貴明
1973年東京生まれ。エンジニア兼技術系ライター。株式会社はてな勤務。近著に「俺流Amazonの作り方」(アスキー)、「詳解RSS〜RSSを利用したサービスの理論と実践」(ディー・アート)など。趣味はラテン音楽と海外旅行と神輿。主な原稿の執筆場所はスターバックスと通勤電車の中。


INDEX
第3回:IdPサンプルでログイン機能を実装
  IdPを立ててみよう
サンプルの中をみてみよう
  IdPでのログインと認証の関係を見てみる