checkid_immediateを利用したConsumerを作成する
「第2回:PHPで作ろうConsumer」で紹介したサンプルでは、認証時にページ遷移を必要とする「checkid_setup」を利用しています。ここではサンプルを改造し、ページ遷移を行わない「checkid_immediate」を利用したスタイルに変更してみます。
「checkid_immediate」を利用する場合、Identifier URLが入力され、「login」ボタンが押されたところでJavaScriptを利用したIFRAME生成とConsumer、IdPの呼び出し、さらに認証作業が行われます。
改造した「index.php」では、「login」ボタンを押すとJavaScriptのauthという関数が呼び出されます。指定されたIdentifier URLを基にアクセスするURLとIFRAMEを生成します。なおこのIFRAMEは非表示にしたDIVの中にセットされるため表示されません。IFRAMEのsrc属性にアクセスするURLがセットされ、結果としてIFRAMEの中で、Consumer(やIdP)へのアクセスが行われるのです。
実際の認証作業が行われる「try_auth.php」では、「checkid_setup」の代わりに、「checkid_immediate」を使うように変更する必要があります。変更点は「$redirect_url = $auth_request->redirectURL(getTrustRoot(),getReturnTo(),true);」と「$form_html = $auth_request->formMarkup(getTrustRoot(), getReturnTo(),true, array('id' => $form_id));」の2箇所で、それぞれOpenID 1.1とOpenID 2.0を利用する部分に「true」をセットします。

図2:ログイン時の流れ
またサンプルのメッセージ表示には「index.php」を再利用しています。ただし、内容をIFRAMEの中に埋め込むため、メッセージの表示部分を「message.php」というページに切り出して利用しています。「common.php」と「finish_auth.php」の中でindex.phpが呼び出されているため、該当箇所を「message.php」に変更します。
「finish_php」では、認証が成功した際に$is_completeという変数をセットします。さらに$name変数にIdentifier URLをセットします。message.phpでは$is_complete変数がセットされている場合に認証が終了したものとみなし、親ドキュメント(index.php)の「finish_auth」メソッドを呼び出します。その際、$nameの内容を引数として渡します。
引数が渡されたfinish_authは、「認証に成功したIdentifier URLである」とみなして引数の内容を表示します。もし引数がなければ失敗と見なし「needSetup」というメッセージを表示します。
なおfinish_auth.phpでは、OpenID_Auth_Consumerのcompleteメソッドが返すオブジェクトのstatusプロパティをチェックして認証の成功/失敗を判定していますが、そこに「Auth_OpenID_SETUP_NEEDED」というステータスの判定を追加しておく必要があります。これは、すでに述べているように「checkid_immediate」では、認証に失敗したときに「checkid_setupでの認証が必要」というステータスが返ってくるからです。
サンプルをサーバに設置したら、取得済みのOpenIDのアカウントを利用してテストしてみましょう。ただし、IdPによっては「checkid_immediate」に対応していないケースもあるため、利用するIdPに注意してください。checkid_immediateに対応したものとして「vox(http://vox.com/)」などのアカウントがあげられます。
今回紹介したサンプルは非常にシンプルなため、実際にConsumerとして実装する場合には、受け取った認証情報からクッキーを発行したり、認証情報を基に受け取ったページの内容を書き換えるなど、さまざまな肉付けが必要です。
次のページ