Relying PartyとIdentityの関連づけについて
啓蒙活動も兼ねて最近は面白いOpenID関連の話題には積極的に絡んで行こうと思ってます。
で、早速面白い記事を発見しました。
元ネタはid:IwamotoTakashiさんの、
なんですけど、過去記事を遡らないと分からないので、簡単にどういう問題なのか説明しておきます。
RPはエンドユーザーのどのIdentityに対して一意なユーザーと認識するべきか
まずは1.1時代の話
1.1時代はClaimed Identifierと言うのは下記の二通りしかありません。
- 実際にIdPで発行されているIdentifier
- 自分が所有しているURLにdelegate設定がある
前者に関してはClaimed Identifier = Verified Identifierですが、後者は厄介です。
- Claimed Identifier
- http://zigorou.art-code.org/
- Delegate
- http://zigorou.vox.com/
だとすると、Verified IdentifierがDelegateのURLであるhttp://zigorou.vox.com/となります。
これの何が問題かと言うと、割と多くの人が考えている、
- OP(IdP)が死亡したらダメじゃん
- OP(IdP)がダウンしてたらダメじゃん
と言う疑問に対する一つの回答がこのdelegateシステムなんですが、仮にRPがVerified Identifierと実際のRPのユーザーを関連づけてしまうと、困った事にこの懸念がもろに効いてしまいます。
Delegateを使った場合のレスポンスでは、
openid1_claimed_id=http://zigorou.art-code.org/ openid.mode=id_res openid.identity=http://zigorou.vox.com/
のような値が返って来ます。*1
ですので、id:IwamotoTakashiさんのエントリを引用すると、
で、仕様書を読み直してみたんですが、OpenID 1.1の場合、Claimed IdentifierとVerified IdentifierのどちらをConsumerのアカウント情報と紐づけるべきかは定義されていませんでした。だからどっちでもいい(えー)。
とりあえず2.0の話は置いといて1.1の話で言うと、それは僕は間違いだと思います。id_resの段階で判断する事には変わりないですが、Claimed Identifierを採用すべきだと思います。
理由は二つ。
- まずは先に挙げたOPの切り替えが出来なくなるから
- そもそもdelegateによって本当に自分が所有しているURLを自分のIdentifierとしてRP上で使いたいであろうから
次は2.0の話
2.0ではopenid.delegateでは無くてopenid2.local_idとしてdelegate先のURLを指定するので、所有するURLで
<link rel="openid2.provider" href="OpenID 2.0のエンドポイント" /> <link rel="openid2.local_id" href="OPの実際のIdentifier" />
って指定する事でdelegateが出来ます。
また2.0からUser-Supplied Identifierと言う新しい概念が入ってて、自分のIdentifierじゃなくてOP Identifierってのを入力する事が出来るようになったので、例えばY!なら、yahoo.comとか入力出来ちゃう訳です。
このせいでRPでは認証開始時にclaimed identifierを取っておくと言う事が無意味になるので、先に述べたようにid_res時に判断するしかない。
OP Identifierを使った際のid_resの中身は、OP側でhttps://me.yahoo.com/zigorou.masudaを採用した場合は、
openid.claimed_id=https://me.yahoo.com/zigorou.masuda openid.identity=https://me.yahoo.com/zigorou.masuda
となり両方同じ値になっている。
仕様のPositive Assertionによれば、
openid.identityは1.1時代はVerified Identifierと言う扱いだったが、明確にOP-Local Identifierだと定義されている。これはつまるところ最終的にどのIdentifierに帰着したかと言う意味である。
で、delegateした場合のid_resは、
openid.claimed_id=http://zigorou.art-code.org/ openid.identity=https://me.yahoo.com/zigorou.masuda
となってopenid.claimed_idは確かに期待した値が記載されている。
つまり何が言いたいかと言えば、いずれの場合でもユーザーがIdentifierとしてOP, RPに対して主張してるのはClaimed Identifierなんだから、そちらを紐づけるべきだと言う事です。
これは1.1でも同じ事。
結論(あくまで自分の見解)
どちらも問題はないのだが、これからRP(Consumer)を作るなら、OpenID 2.0に合わせて(IdPからの)レスポンスに含まれるVerified Identifierを紐づけるのが得策だと思う。OpenIDのバージョンによって処理を大きく変える必要がなくなるので。
これは僕は違う意見で、Claimed Identifierを紐づける必要があると思います。ユーザー視点の考え方ではありますけども。
但し、セキュリティとかって観点から言うと、特にdelegateの場合(Claimed IdentifierとVerified Identifierが一致しないケース)は監視対象とすべきだと思う。
考えられるのは、
なんて事が考えられるからですけど。
極論言えば、Y!のIdentifierであの変な文字列の奴があるけど、delegate先にそれを指定しててRP側でその変な文字列が自分のIDなんて悲し過ぎるって話じゃないのかなとw
*1:だいぶ省略してるけど