サンプルの中をみてみよう
では、サンプルの中身をのぞいてみましょう。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というメソッドを呼び出しています。これらのメソッドがアソシエーションハンドルの発行や共有暗号鍵のチェックを行っています。 次のページ