さて、近いうちにXoopsにOpenIDを組み込むとして、では OpenIDは何を「Relying Party (RP)」(この場合は、情報提供元としてのXoops)に何を提供してくれるのか?
OpenIDは、今、訪れようとしている人が自分のWebページであると宣言したURLの持ち主であるという事を(そのWeb Pageがクラックされていないとして)認証している。逆に言うとそれだけだ。Blogにコメントをする際の認証としては十分だろうが、よりバリューの高いサービスを提供する場合には、別のものと組み合わせることになるのだろう。
例えば、王分市(おーぷんし)に住んでいる人に対するサービスの場合(例:王分市民割引のあるインターネット本屋)、OpenIDでログインしてきた人がそのサービスを利用する事を認可するには、OpenIDを認証するだけでなく、そのOpenIDの持ち主が王分市民であるということを認証してくれるサービスに行って、そのAssertion もあわせて持ってきてくれということになるであろう。
その場合は市役所がその属性認証サービスの提供者になるのが自然だと思うので、そういうことにして話を進めてみる。
王分市はおそらく、内部では市民番号とかそういうもので管理しているだろう。このサービスを提供するには、この区民番号とそのユーザのOpenIDを結びつけなければ成らない。たとえば、そのユーザの区民番号が 12345678 で、OpenID が http://example.com/suzuki だったら、一回、この両者を結びつける事をどこかでやっておかなければ成らない。最初の1回は、転入時かなにかに紙で申請するのかな…。もともと王分市としてもOpenIDを提供しているという事も考えられる。転入すると、OpenIDが提供されるのだ。仮にそのOpenIDが、http://open-city.or.jp/12345678 だったとしよう。(以下うざいので http:// は省略。)
すると、この open-city.or.jp/12345678 の属性として、example.com/suzuki を登録しておくことができれば良い。そうなっていれば、example.com/suzuki が 王分市民であると証明できることになる。方法は2つ。
(1)RP 側が、open-city.or.jp に query をかけて、属性を確かめる。
この場合、example.com/suzuki さんが、あらかじめこの属性を公開するルールを
設定してあるか、あるいは、何らかの形で個別承認を与えるような形になって
いる必要がある。
(2)example.com/suzuki 側が、open-city.or.jp で Assertion を取得して、
これを提示する。
Consumer 側が、ユーザに、市民である事を open-city.or.jp で証明してきて♪と
言って、おそらく One-time session ID をつけてリダイレクトする訳だ。
すると、ユーザは example.com/suzuki としては
すでにログイン済みだから SSO で open-city.or.jp に自動でログインして、
example.com/suzuki という URL に市民証明サインをしてもらって、Consumer に
もどる。(もっと安全にしたければ、One-time session id を Consumer が
ふりだして、それに署名してもらうのでも良い。)
すると、やはり市民だという事が証明される。
まぁ、(1) も (2) もほとんど等価だな。(というか、SAML には、両方とも Binding があるような…。)†
本当は、ここまで来て、やっと役に立つというところか。
しかし、便利そうではある。
問題は、OpenIDとして使った example.com/suzuki が、違う人によって再利用される可能性があるという事だ。鈴木一郎さんが最初は example.com/suzuki を使っていたとしよう。しかし、ある時から彼はこのプロバイダーをやめて、newexample.com/suzuki に移動してしまったとしよう。普通におこりそうなことだ。これ自体は問題ない。しかし、次に黒須市民の鈴木花子さんが example.com に加入して、 example.com/suzuki を使いはじめたとしよう。しかも、鈴木一郎さんは、open-city.or.jp/12345678 を更新し忘れていたとしよう。すると、上記(1)のシナリオの場合、鈴木花子さんは、黒須市民であるにも関わらず、王分市民割引を得る事ができてしまう。(ということは、(2)の方が望ましいという事ですね。)
この問題を回避するには、IDが再利用されない事を保証すれば良いのですが、OpenIDだけのフレームワークでは難しそうですね。
そういう観点からも OpenIDは i-name を取り入れているのかな?(Drummond に聞いてみよう…。)i-name だと、i-number (i-name を取得すると必ず振り出される絶対番号。絶対に再利用されない。)がその下にあって、機械はこちらを使うようになっているので、上記、鈴木一郎さんの example.com/suzuki と鈴木花子さんの example.com/suzuki を混同することはないから。
† ちなみに、OpenID Attribute Exchangeというものが検討されている。
これはまた別の機会に取り上げることにしよう。