PHP-OpenIDを使ってみよう
今回は、「Identity Provider(以下、IdP)」の提供するアカウントを利用し、ログイン作業を行う「Consumer」の作成を行いながら、OpenIDの解説を進めていきます。
今回Consumerの作成に使用する言語としてPHPを選びました。実はOpenIDのConsumerやIdPを構築するためのライブラリとして、さまざまな言語向けのものが公開されており、1から構築する必要はありません。
OpenIDの公式サイトである「opdnid.net」にもその一覧
(http://wiki.openid.net/Libraries)が公開されてます。複数あるPHP向けのライブラリから、もっとも一般的な「PHP OpenID Library(JanRain PHP OpenID)」を利用してみることにします。
配布元(http://www.openidenabled.com/php-openid/)から、PHP OpenID Libraryをダウンロードするのですが、現在バージョン1とバージョン2の2種類が公開されています。今回は、最近仕様が確定したOpenIDバージョン2に対応しているPHP OpenID Libraryバージョン2を使うことにします。
早速、ライブラリに付属したサンプルを動かしてみましょう。「examples」の中の「consumer」ディレクトリをWebサーバの公開ディレクトリ上に、ライブラリが格納されている「Auth」ディレクトリをアクセス可能な場所(PHPのinclude_pathで指定されている場所、もしくはサンプルを動かすだけならconsumerディレクトリ内にコピーしてしまってもかまいません)に保存します。
用意ができたら「consumer」ディレクトリの中の「index.php」をWebブラウザで開きます。英語のメッセージとともに、入力フォーム付きのWebページが表示されるので、そこにOpenIDのIdentifier URL(前回設定した自分のブログのURLや、はてな、livedoorなど好きなものが利用できます)を入力して「Verify」ボタンを押すとログイン処理が実行されます。
図1:ログイン処理の流れ
(画像をクリックすると別ウィンドウに拡大図を表示します)
多くのIdPの場合はログインを許可するかどうかのダイアログが表示され、許可するとログイン状態となり、現在ログイン中のIdentity URLが表示されます。もし、許可しなければ「Verification cancelled.」と表示され、認証に失敗した状態となります。
なお、このサンプルにはログイン状態を保持する仕組みがなく、Webページを閉じると再度ログインする必要があります。継続的にログイン状態を保持したい場合には、情報をサーバ側で保持するとともに、cookieなどを出力してログイン情報とWebブラウザを結びつけます。先ほど実行したサンプルでは使われていませんが、ライブラリには認証情報をデータベースに保存するための仕組みも用意されています。
サンプルのConsumerは、「index.php」と「try_auth.php」「finish_auth.php」「common.php」の4つのファイルから構成されています。
「index.php」はログイン処理を行う入力フォームです。「index.php」にIdentity URLを入力した際のPOST先が「try_auth.php」であり、そこで実際の認証処理を行います。この箇所がOpenIDの認証でもっとも重要な部分です。認証が完了した際の画面は「finish_auth.php」で表示されます。「common.php」はそのすべてからincludeされている共通部分です。
また、Authライブラリの中には、「OpenID」と「Yadis」という2つのディレクトリが存在しています。このうちOpenIDはその名の通り、OpenID関連の処理を行うためのライブラリ本体です。そしてYadisは、OpenIDのIdentifierのように、Webページ上にある識別情報を取得するための共通仕様で、OpenIDのバージョン2における、Identifierの取得に利用されています。
ちなみに、サンプルのindex.phpを表示すると、Identity URLの入力欄の下に「Optionally, request these PAPE policies」と書かれた一連のチェックボックスが表示されます。これは、「OpenID Provider Authentication Policy Extension」と呼ばれるOpenIDの拡張仕様で、認証におけるポリシーを指定できるものです。PAPEの仕様はまだDraft(草稿)ではありますが、PHP-OpenIDはこれに対応しています。 次のページ