日向夏特殊応援部隊

俺様向けメモ

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/となります。

これの何が問題かと言うと、割と多くの人が考えている、

  1. OP(IdP)が死亡したらダメじゃん
  2. 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が一致しないケース)は監視対象とすべきだと思う。
考えられるのは、

  • 最初は信頼されてるOPのIDをdelegate先にして
  • 後からそうでないIDをdelegate先にする

なんて事が考えられるからですけど。

極論言えば、Y!のIdentifierであの変な文字列の奴があるけど、delegate先にそれを指定しててRP側でその変な文字列が自分のIDなんて悲し過ぎるって話じゃないのかなとw

*1:だいぶ省略してるけど