TOP情報セキュリティ> 第2回:PHPで作ろうConsumer (3/3)




使って広がるOpenIDの輪

使って広がるOpenIDの輪

第2回:PHPで作ろうConsumer

著者:はてな  水野 貴明

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

Consumerの仕組みについてもう少し詳しくみてみよう

さて、駆け足でPHP-OpenIDのConsumerのサンプルを紹介しましたが、その中で出た用語や意味を詳しく解説しておきましょう。

OpenIDは現在、バージョン1.1とバージョン2.0の2つの仕様が存在しています。バージョン2.0の最終仕様は2007年12月5日に公開されたばかりで、利用できる暗号化方法の選択肢の拡張をはじめ、いくつかの手順やパラメータの名前、用語などが変更されています。

例えば本記事では「Consumer」「IdP(Identity Provider)」という言葉を使っていますが、バージョン2では「Relying Party(RP)」および「OpenID Provider(OP)」に変更されました。認証対象となるルートURLである「openid.trust_root」は「openid.realm」に変更になっています。

ただし、ConsumerやIdPという言葉は、PHP-OpenIDのライブラリの中でも使われているため、本記事ではバージョン1.1での呼び方に統一しています。なお、バージョン2のドキュメントを読む際には、上記の新しい呼び方で書かれているので、注意が必要です。

バージョン2はまだ公開されたばかりで、それを実装しているIdP(OP)もまだほとんどありません。しかし今後は、そうしたIdPも増えてくるでしょう。ちなみにOpenID-PHPは、バージョン1.1と2.0のどちらも利用できるようになっています。今回はバーション2について詳しくは述べませんが、興味のある方はOpenIDの公式サイト(http://openid.net/)の仕様書をご覧ください。

OpenIDでは、1度の認証の間にエンドユーザとConsumer、IdPの3つのコンピュータの間で、何回ものやり取りが行われます。すべてのやり取りはHTTPプロトコルに則り、POSTもしくはGETリクエストによって行われます。例えばクエリパラメータやPOSTの場合は、データの名前と実際のデータの内容というペアで、メッセージボディに格納されています。名前はすべて「openid.」ではじまります。

サンプルとして、IdPへConsumerからリダイレクトされた場合のURLをみてみます(リスト1)。

リスト1:IdPへConsumerからリダイレクトされた場合のURL
http://www.openid.ne.jp/user/auth?openid.assoc_handle=%7BHMAC-SHA1%
7D%7B475c7a5c%7D%7BOJ2v4w%3D%3D%7D&openid.identity=http%3A%2F%
2Fnanzou.openid.ne.jp%
2F&openid.mode=checkid_setup&openid.return_to=http%3A%2F%
2Fwww.takaaki.info%3A80%2Fopenid_consumer%2Ffinish_auth.php%
3Fjanrain_nonce%3D2007-12-11T18%253A52%253A30ZbtXZ1b%
26openid1_claimed_id%3Dhttp%253A%252F%252Fnanzou.openid.ne.jp%
252F&openid.sreg.optional=fullname%
2Cemail&openid.sreg.required=nickname&openid.trust_root=http%3A%2F%
2Fwww.takaaki.info%3A80%2Fopenid_consumer%2F

アクセス画面の表示パターン
図3:アクセス画面の表示パターン
(画像をクリックすると別ウィンドウに拡大図を表示します)

データ量が多くわかり辛いですが、「openid.assoc_handle」や「openid.identity」「openid.return_to」「openid.trust_root」などのパラメータがURLに含まれているのがわかるでしょう。openid.identityは、エンドユーザーが送ってきたIdentifierのURLが入っています。openid.assoc_handleは「アソシエーションハンドル」です。これはすでに解説しましたが、ConsumerとIdPの間でのやり取りの際にリレーの「たすき」のように必ずつけて送られるデータです。

また、openid.modeというデータもあり、上記の例ではcheckid_setupというデータが入っています。これは「checkid_setup」というモードでIdPの認証処理を行う、ということを指定したものです。これは、今回のサンプルのように、リダイレクトなどを用いてIdPのWebサイトに誘導され、そこで認証処理が行われる方法です。さらに「checkid_immediate」というモードでは、JavaScriptなどを使って画面遷移せずに認証を終えることができます。

通常IdPは、WebブラウザからのアクセスをCookieなどを使用して状態を判別する、独自のログインシステムを備えています。渡されたIdentifier URLと、ログインしているユーザが一致すれば、「読み取りを許可しますか?」といったメッセージを表示します。しかしログインしてなければ、ログインを促し、ユーザが違えばエラーやユーザ名切り替え画面を表示します。

このあたりの挙動はIdPに一任されています。例えばユーザ情報が一致すれば特に確認画面を表示せず、「認証成功」と見なしてConsumerにリダイレクトをしてしまうIdPも存在します。

さて、次回はIdPのより詳しい仕組みや実装方法について、実際にサンプルを使って解説します。


前のページ  1  2  3


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


INDEX
第2回:PHPで作ろうConsumer
  PHP-OpenIDを使ってみよう
  サンプルの中身をみる
Consumerの仕組みについてもう少し詳しくみてみよう