TOP情報セキュリティ> 第4回:OpenIDの仕様を改めて復習してみよう (1/3)




使って広がるOpenIDの輪

使って広がるOpenIDの輪

第4回:OpenIDの仕様を改めて復習してみよう

著者:はてな  水野 貴明

公開日:2008/1/9(水)

OpenIDの仕様を改めて復習してみよう

本連載ではPHPによるOpenIDのサンプルを使って、実際に「Consumer」や「Identity Provider(以下、IdP)」を動かしながら、その仕組みについて解説してきました。かなり駆け足で紹介してきたため、今回はこれまでの解説を踏まえながら改めてOpenIDについておさらいします。

OpenIDでIdPが受け付けるアクセスには「associate」と「checkid_immediate」「checkid_setup」「check_authentication」の4つのモードがあります。これらは認証のたびにすべてが呼び出されるのではなく、状況によって選択されます。

まず「associate」では、アソシエーションハンドルとその有効期限、共通暗号鍵がIdPからConsumerに渡されます。アソシエーションハンドルは有効期限の間は再利用可能で、期間内に新たな認証処理をした場合に「associate」モードでのアクセスを省略できます。もちろん、このためにConsumer側でアソシエーションハンドルを保存する仕組みを用意する必要があります。

アソシエーションハンドルが手に入ったら、続いて実際の認証処理を行います。Consumerは「画面遷移を伴うかどうか」によって、「checkid_setup」と「checkid_immediate」の2つの方法からどちらかを選択します。

「checkid_setup」は画面遷移を伴う認証処理です。ConsumerはエンドユーザのIdPに対し、「associate」のプロセスもしくはキャッシュから手に入れたアソシエーションハンドルの情報を使ってアクセスするように、リダイレクトなどを使って促します。

その際、IdPにはアソシエーションハンドルのほかに「trust_root」や「return_url」などの情報が同時に送られます。IdPではこのような情報とエンドユーザのIdPへのログイン状態などを調べ、認証処理を行った「成功」か「キャンセル」の結果をConsumerに返します。

認証開始から終了までの流れ
図1:認証開始から終了までの流れ
(画像をクリックすると別ウィンドウに拡大図を表示します)

「checkid_immediate」は「checkid_setup」とほぼ同じ働きを行いますが、ページ遷移を行わずにすむようにデザインされています。その方法としては、非表示にしたIFRAMEを用いるなどしてIdPへのアクセスを行います。認証後はリダイレクトにより、return_urlで指定されたConsumerのURLに移動します。

最後の「check_authentication」は、共通暗号鍵を保持できないConsumerだけが利用するものです。「associate」と同様、ConsumerとIdPの間でやり取りを行い、エンドユーザは関与しません。

「checkid_setup」や「checkid_immediate」で認証が成功すると、IdPはConsumerに対して「openid.sig」というデータをリダイレクトを介して渡してきます。これは、「associate」時に送られてきた共通暗号鍵でアソシエーションハンドルを暗号化したものです。

Consumerが共通暗号鍵を保持している場合は、同じ処理をアソシエーションハンドルに対して行い、結果が同じになることを確認します。これはやり取りの途中で、本来のIdP以外が成りすましを行う危険性を排除するためのものです。

「checkid_setup」や「checkid_immediate」は、エンドユーザによるリダイレクトを介してしまうため、悪意を持った第三者が「認証されました」という嘘の情報をConsumerに送ることが考えられます。しかしエンドユーザには知らされない共通暗号鍵で暗号化したデータによって、きちんとIdPによって認証された情報であることを保証しています。

もしConsumerが自分のサーバにデータを保持できない場合、共通暗号鍵も保存できません。この場合は、認証の最後に「check_authentication」を行います。これは、送られてきた情報をそのままIdPに送り返すことで、整合性をチェックしています。

第2回:PHPで作ろうConsumer」で紹介したConsumerのサンプルでは、情報を保存するために「Auth_OpenID_Store」クラスのサブクラスを指定しました。サンプルでは「Auth_OpenID_FileStore」が指定されており、共通暗号鍵やアソシエーションハンドルなどはファイルに保存されています。なお、ここで「Auth_OpenID_DumbStore」クラスを使うと、状態を保持しないConsumerを作成できます。

OpenID 1.1では、情報をConsumerが保持する場合をSmartモード、保持しない場合をDumbモードと呼んでいます。 次のページ


1   2  3  次のページ


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


この記事の評価をお聞かせください
ボタンをクリックしますとウインドウが開きます。

INDEX
第4回:OpenIDの仕様を改めて復習してみよう
OpenIDの仕様を改めて復習してみよう
  checkid_immediateを利用したConsumerを作成する
  OpenID 2.0
使って広がるOpenIDの輪
第1回 2行で簡単Identifierをはじめよう
第2回 PHPで作ろうConsumer
第3回 IdPサンプルでログイン機能を実装
第4回 OpenIDの仕様を改めて復習してみよう