> 英語が不得意で仕様もうまく拾えないのですが、"#" に続いた URL はこっちで(自営の部分)で削除してしまって良いのか?などとも考えていま
> す
私は JanRain の PHP に触れたことはないのですが、
この話はOpenID 2.0 になって各所で話があがっていますが、
7.2 normalization の 3 が参考になります。
<snip>
さもなければ、入力はHTTP URLとして扱われるべきです;
もしそれが"http"か"https"スキームを含まないなら、そのIdentifierは文字列"http://"を先頭につけられなければなりません。もしそのURLがfragmentパートを含むなら、それはfragmentを区切る文字"#"と合わせて取り除かれなかればなりません。更なる情報の為にSection
11.5.2 (HTTP and HTTPS URL Identifiers)を読んでください。
</snip>
http://lab.koshigoe.jp/en2ja/openid-authentication-2_0.html#normalization
2008/4/2 LDU05653 <LDU0...@gmail.com>:
--
Takatsugu Shigeta
このnormalization はユーザが Identity URLを入力して OpenID
の認証セッションを開始するときに行うもので、認証がおわってもどってきた identity_url に対して実行するものではないですね。
--
Tatsuhiko Miyagawa
「事前に登録した物」が何を意味しているのかわからないのですが、User-Supplied Identifier のことだとすれば、ユーザが
yahoo.co.jp のように Directed Identity を入力した場合、そもそも Claimed Identity
とは異なる値になるのが当然なのでは。
--
Tatsuhiko Miyagawa
Perl では無く、Python でした
> JanRain の他の 言語の Ruby や Perl のデモを実行すると フラグメントは付いてこないようです
参考:
http://wiki.openid.net/OpenIDChanges#Explicitly_allow_fragments_on_OpenID_identifiers
The OpenID provider can send a URL with a fragment as the claimed
identifier. The full URL (with the fragment) is the user's identifier,
so relying parties store the URL with the fragment.
とこれはみなさんおっしゃっているとおり、フラグメント付きで格納しておけと。
ですが、
The URL without the fragment should be used when the URL has to be displayed.
表示するときはとっちゃえばいいじゃんと。
吉松
まぁ、言ってしまえばその通りだと思います ^^;
>
> とこれはみなさんおっしゃっているとおり、フラグメント付きで格納しておけと。
>
> ですが、
>
> The URL without the fragment should be used when the URL has to be displayed.
>
> 表示するときはとっちゃえばいいじゃんと。
>
先に崎村 さんが記された
この「別のユーザに割り当てたような場合」は、登録されたデータと一致させることが出来ませんので RP でリジェクト処理を行いますが、エンドユーザ
> フラグメントを切り捨てたものは、あくまでユーザ提供識別子であって、Claimed Identifier として取り扱うことはできません。
>
> この仕様は、OPがあるURLを別のユーザに割り当てたような場合(URL Recycling)に対応するために2.0で追加されたセキュリティ機能です。
には事由が判りませんよね?
そう言う事象が起きないように OP が担保している訳では無いと言うことですよね?
「別のユーザに割り当てたような場合」が想定されていると言うことは、容易に想像できます
たとえば鈴木一郎さんが所有を主張した http://www.example.com/suzuki/ を手放し、鈴木次郎さんが同じ OP で同じ
ようにID を取得した場合、フラグメントなどの情報がないと一意であることを担保できません
# URL Recycling は多分そう言うことですよね?
## 鈴木一郎さんと鈴木次郎さんが同じサービスを利用する場合どうなるか興味有ります ^^
Claimed Identifier はエンドユーザが所有していると主張するアドレスで、これは引き合いの通り、エンドユーザの自由であると思われ
ます
OP は、その User-Supplied Identifie が鈴木一郎さんか鈴木次郎さんのどちらの物であることを RP に知らせればいいと
言うことだと思います(あってますか?)
# その際に使われるのが、フラグメントなどの識別子なんだと思います..
ですが、User-Supplied Identifier は この場合、フラグメントなしで有ると想像することが出来ますよね?
Yahoo! JAPAN などは、User-Supplied Identifier に「https://me.yahoo.co.jp/a/
XXXXX39TV.B8ViMk8P4qVtiTEciC 」とを使えと言っている様です(そういう風に見えます)
# ここが自分の考え方のおかしいところか..
## 自分の Claimed Identifier と User-Supplied Identifier の言い回しが正しくない気がする..
で、吉松さんのがおっしゃるように「表示するときはとっちゃえばいいじゃんと。」と考えました
自営の RP では、崎村さんのおっしゃるように「主張識別子(Claimed Identifier)を調べ、これをデータベースに登録する」様にし
たいと考えます
鈴木一郎さんの知らないうちに Claimed Identifier が鈴木次郎さんの物となった場合が心配になってきましたが..
まぁ、 Yahoo! JAPAN の場合、何かのハッシュになっているようなので重複することは考えにくいのでしょうが..
--
JanRain のフレームワークでは、わざわざ getDisplayIdentifier() 関数で 表示用の Identifer を提供する
ことが出来るようです
しかし、この getDisplayIdentifier() で帰る Identifier もフラグメントが付いてきます
最初の疑問点はそこで、Ruby などのフレームワークでは表示されないフラグメントを自営の RP で細工しても良いのか?でしたが、「表示するとき
はとっちゃえばいいじゃんと。」の方向で作業しようと思います
Miyagawa さんに最初におしえて頂いたとおり、エンドユーザが User-Supplied Identifier を自営の RP に登録す
る場合、Claimed Identifier と違う事を前提に、OP に確認しに行き、「あなたの Identifier は Claimed
Identifier(ここで言うフラグメント付き)と登録されます」などとすれば良いかな?
この"登録作業"が終わったとは、ログイン認証のみですので、User-Supplied Identifier や、Claimed
Identifier、OP Identifier (であってますか?)の yahoo.co.jp でも利用できるようにします
こんな感じで矛盾のない運用が出来るのかなぁ..
散文ですが、おかしい点など指摘して頂けると助かります
今は、URL Recycling された Claimed Identifier を User-Supplied Identifie が同一な主
張をされた場合、どう処理すればいいか?も気になります
IdP がどう扱うか?次第なのかな..
# 鈴木一郎さんが所有を主張する User-Supplied Identifie なので次郎さんはどうしよう..
## 「Authentication 2.0 以降のみ対応」とすべきなのか..
この辺が仕様を読み切れない不甲斐なさですが、
openid-ja の皆様、もう少しお付き合いして頂けると助かります
フラグメントがついているから区別できますね。
> また、ユーザに見せる、見せないの話でもありません
> RP が利用している ID とエンドユーザが自分で思っている ID と差異があっては困るのでは?ということです
Yahoo!の場合はユーザが入力するのはyahoo.co.jpですから差異があるのがそもそも当然ですね。
--
Tatsuhiko Miyagawa
こんにちは。
考えさせられるテーマだったので、ちょっと持論で、しかも長文で散文ですが書いてみます。
まず、yahoo.co.jpの動作を見ます。
YahooのOpenID(op identifierじゃないです)を入力すると、RPからはopenid.claimed_id,
openid.identityともに同一のフラグメント無しの値で送信されます。しかしOPからはopenid.claimed_idにフラグメントが付与されて帰ってきます。ライブラリを読んではいませんが、おそらくこの値を返しています。
そこで、吉松さんのメールにある参照先をみると、OPはOpenID Identity URLにフラグメントを足しても良いよと言っている。
しかしこれをUser-supplied
Identifierとして利用すると、RPはフラグメントを除去してDiscoveryしなければならない。それにもかかわらずyahoo.co.jpのようなOPはAuth
responseのopenid.claimed_idにフラグメントを付与してくる。
ということで、私は下記のように考えています
■大前提
「RPは入力されたUser-supplied Identifierから派生するIdentifierの中でもっとも一意性が高いものを記録すべきである。」
「OPが直接返してきた値を記録すべきである。」
と考えています。
■User-supplied IdentifierがXRIだったら
識別子がXRIの場合を考えると、User-supplied
Identifierはあくまでその時点でユーザが所有していると思っているIdentifierであれば良くて、ReassignableでもPersistentでも良いわけです。URLの場合はUser-supplied
Identifierは正規化されてフラグメントも除去されてとありますが、XRIの場合はCanonical
IDですとあります。Canonical
IDはPersistentなものだとあります。XRIにおけるPersistentとは「時間と空間」の2軸においてGloba
Uniqueかつnot-reassignableということですので、RPはAuth
request中のopenid.claimed_id(Canonical ID)をそのまま覚えておけば、たとえUser-supplied
IdentifierがReassginableなもので所有者が移っていたとしても、本質的なユーザーの違いを考慮することができます。
■User-supplied IdentifierがURLだったら
一方、User-supplied IdentifierがURLだった場合は・・・正規化されてフラグメント除去されてClaimed
Identifierになりますが、これって結局、LDU05653さんの仰るようにID発行元のポリシーによってReassignableですよね。http://example.com/suzukiを所有する鈴木さんが解約してID
recycleして別の鈴木さんに使わせてあげるような場合です。つまり、ここでOPが一意発行ポリシーを取っているならば、claimed
identifierを記録してしまえば良いと思います。auth responseのopenid.claimed_idですね。
しかしながら本質的にはドメイン名自体がReassinableなので、URLのClaimed
Identifierそのものは本質的にReassinableですが・・・(ただし時系列的には所有する本質なユーザは一意です。)
■OPが発行するOpenID URLがReassignableだったら
本質的なURL Claimed IdentifierのReassinable性はあらめるとして、次にOPがOpenID URL(user
id)の再利用発行ポリシーを採っている場合を考えます。
RPはUser-supplied Identifierを正規化して得られるClaimned
Identifierをそのまま記憶したところで、時系列的に別のタイミングでの所有権を持つユーザと、過去に所有権を持っていたユーザとの区別はつきません。しかしながら、今回のyahoo.co.jpの実装では、Auth
responseのopenid.claimed_idの値には管理番号ともとれるフラグメントが付与されており、この付加情報により一意性を担保していると予想するならば、Auth
responseのopenid.claimed_idをフラグメントが付いたまま記録しておくべきという、崎村さんの仰る方法にすべきだと思います。
ある時点での所有者のOpenID URLを(OpenID URL +
所有者固有番号)という本質的なユーザへマッピングができるのはOPだけですから、OPの返した値を記録すべきですね。
その次はOP-local Identifierですが・・・そこまで考えると頭が壊れそうなので、今回はやめます。。。
■結論?
0. OPはAuth responseのopenid.claimed_idでglobal uniqueなものを返すべきである。
1. OPは可能な限りリサイクル不能なOpenID URLを提供すべきである。しかしそれをフラグメントによって表現し、ユーザへ提供することは無意味である。
2. 少なくともOPはAuth response中のopenid.claimed_idでは時間と空間的に一意なOpenID
URLを返すべきである。この際のOpenID URLにはフラグメントを利用しても良い。
3. RPは上記の0に加えて1か2を満たしたOPからのAuth response中のopenid.claimed_idを記録すべきである。
4. ドメイン名のReassignable性がopenid.claimed_idのglobal unique性に与える影響は、さわやかに諦める。
なんというか、勝手OPの発行したOpenID URLなんて使う気にもなりません。
だって、自分が持っていたOpenID
URLが再割り当てされて、たまたま自分が利用していたRPサイトのアカウントに、どこかの誰かにログインされちゃう可能性があるんですから。
このあたりのベストプラクティスを考える上でも、一定の指針を打ち出すような必要があるのかもしれませんね。
--
=katsu
http://xri.net/=katsu/(+contact)
http://xri.net/=katsu/(+blog)
そうですね。
> ■User-supplied IdentifierがURLだったら
> 一方、User-supplied IdentifierがURLだった場合は・・・正規化されてフラグメント除去されてClaimed
> Identifierになりますが、
ちがいます。正規化するのは*RPが* discovery するときにフラグメントを除去するのであって、OP からわたってきた Claimed
Identifier を正規化してはいけません。
> RPはUser-supplied Identifierを正規化して得られるClaimned
> Identifierをそのまま記憶したところで、時系列的に別のタイミングでの所有権を持つユーザと、過去に所有権を持っていたユーザとの区別はつきません。
Claimed Identifier をそのまま記憶すれば、フラグメントがついていますからユーザの区別がつきます。
> しかしながら、今回のyahoo.co.jpの実装では、Auth
> responseのopenid.claimed_idの値には管理番号ともとれるフラグメントが付与されており、この付加情報により一意性を担保していると予想するならば、
予想するならば、というか、そのためのフラグメント仕様なのだと思いますが。
> ある時点での所有者のOpenID URLを(OpenID URL +
> 所有者固有番号)という本質的なユーザへマッピングができるのはOPだけですから、OPの返した値を記録すべきですね。
そのとおりですね。
> 1. OPは可能な限りリサイクル不能なOpenID URLを提供すべきである。しかしそれをフラグメントによって表現し、ユーザへ提供することは無意味である。
上記の理由により無意味ではないと思います。できる限りリサイクル不能な URL
を提供するのがベストプラクティスであることには同意しますが、それは OP の requirement
ではありません。これは1年ぐらい前に本家で話題になっていますので、興味があればどうぞ。
http://openid.net/pipermail/general/2007-May/002407.html
> なんというか、勝手OPの発行したOpenID URLなんて使う気にもなりません。
> だって、自分が持っていたOpenID
> URLが再割り当てされて、たまたま自分が利用していたRPサイトのアカウントに、どこかの誰かにログインされちゃう可能性があるんですから。
フラグメントを除去して格納してしまうような実装の RP を使う気にならない、というほうが正しいのでは?
それを利用者側がどのようにチェックすればいいのか、というのは興味深い問題かもしれませんね。
--
Tatsuhiko Miyagawa
On 4/5/08, Tatsuhiko Miyagawa <miya...@gmail.com> wrote:
> > ■User-supplied IdentifierがURLだったら
> > 一方、User-supplied IdentifierがURLだった場合は・・・正規化されてフラグメント除去されてClaimed Identifierになりますが、
>
> ちがいます。正規化するのは*RPが* discovery するときにフラグメントを除去するのであって、OP からわたってきた Claimed Identifier を正規化してはいけません。
ごめんなさい、ここ読み違えてました。OP で認証する前に normalize かけて (フラグメント除去して) Claimed
Identifier になる、というのは正しいです。で、リサイクルされていた場合、その値を利用してしまうと(フラグメントがないので)その時点で以前の所有者と同一人物かどうか
RP にはわからない、というのも正しいですね。
# katsu さんの話はこの1箇所だけなんかおかしいなと思っていたのですが単に私が読み違えてました、すいません。
--
Tatsuhiko Miyagawa
> > しかしながら、今回のyahoo.co.jpの実装では、Auth
> > responseのopenid.claimed_idの値には管理番号ともとれるフラグメントが付与されており、この付加情報により一意性を担保していると予想するならば、
>
>
> 予想するならば、というか、そのためのフラグメント仕様なのだと思いますが。
おっと、たしかにそんな仕様が書いてありますね。
根本的に知らずに長文を書いてしまいました・・・
> 上記の理由により無意味ではないと思います。できる限りリサイクル不能な URL
> を提供するのがベストプラクティスであることには同意しますが、それは OP の requirement
> ではありません。これは1年ぐらい前に本家で話題になっていますので、興味があればどうぞ。
> http://openid.net/pipermail/general/2007-May/002407.html
>
ありがとうございます。見てみますね。
>
> > なんというか、勝手OPの発行したOpenID URLなんて使う気にもなりません。
> > だって、自分が持っていたOpenID
> > URLが再割り当てされて、たまたま自分が利用していたRPサイトのアカウントに、どこかの誰かにログインされちゃう可能性があるんですから。
>
>
> フラグメントを除去して格納してしまうような実装の RP を使う気にならない、というほうが正しいのでは?
ここでは勝手OPは結局管理も行き届いておらず、フラグメント付与していようと重複させてくることもあるでしょうという、どうしようもないOPのことを指しています。
でも、仰るとおりそんなRPは使う気にはならないですね。プロプライエタリの場合、ユーザーがそれを認識するのは簡単ではなさそうですが・・・
この後に自己レスしてしまいましたが、僕のほうでフェーズを勘違いしていました。間違いではありません。すいません。
> Authentication
> 2.0のTerminologyだけを見てそう解釈していました。あまり英語は得意ではありませんが、それにしてもこの表現は微妙ですね。
> Claimed Identifier:
> * The Identifier obtained by normalizing (Normalization) the
> User-Supplied Identifier, if it was an URL.
そうなんですよね。仕様書では、Claimed Identifier という言葉が、認証プロセスを通して使われていて、
Claimed Identifier: An Identifier that the end user claims to own; the
overall aim of the protocol is verifying this claim.
となっていて「最初に入力され、正規化された Claimed Identifier
が確かにそのユーザのものであるかを確認するのがこのプロトコルである」となっていますが、実際には、
7.2 This final URL MUST be noted by the Relying Party as the Claimed
Identifier and be used when requesting authentication (Requesting
Authentication).
11.5 The Claimed Identifier in a successful authentication response
SHOULD be used by the Relying Party as a key for local storage of
information about the user. The Claimed Identifier MAY be used as a
user-visible Identifier. When displaying URL Identifiers, the fragment
MAY be omitted.
の2つの場面で Claimed Identifier
が異なる値になっているケース(このスレッドでさんざん話題になっている例だとフラグメント有無)もあるので、ここが混乱を生じさせているという気がしますね。
OpenID 1.x では URL の Identification だけだったプロトコルに、Authentication
を追加したためにここの説明というか用語の使い方が紛らわしいものになっている、のかもしれません。
--
Tatsuhiko Miyagawa
そうですねぇ
相変わらず、散文ですが、こんな感じでしょうか
不勉強な点は指摘して頂けると助かります
-----
・リサイクリングされた ID を含め、ID の一意性を担保する部分が不透明なので、時系列を扱う必要のあるシステムを構築する際に、システム側で担
保する必要があるのではないのか?
-> こちらで指定した"物"を ID として利用してくれるとわかりやすいが (1.1) 、自由度が上がった分、難解になった (2.0)
<- OP が設定した ID を、PR が任意の時点で一意であるか確認する術がないのでは?
<- 一定期間ごとに RP 側で ID が継続的に利用されている物か確認する必要があるか?
・システム内部で扱う情報とエンドユーザが視認できる情報に差異があり、その乖離が大きい場合は、インターネットの利用に不慣れなエンドユーザを想定し
にくいのではないか?
-> OP や RP の指針により表示情報などに差異があり、エンドユーザを混乱させるかもしれない
<- 最初の疑問点で、OP が表明した情報と、RP が入手し表示すべき情報の差異が容認されているが明確な指針がないのでは?
<- 想定として部門サーバなどで ID を管理した場合、管理者の資質に関して問題があ場合の対処などにコストがかかるかもしれない?
-----
以上、二点とそれらに関連する懸案です
以下は補足です
# に続く文は、行間(ぼやき)を示しますので読み飛ばしてください
-----
最初の部分は、普通のメールアドレスなどでも同じですよね?
URL やメールアドレスでも再利用はされます
同様に、利用する側で誤用しないように、留意したシステム設計をすればいいのだと思いますが、コストがかさみます
# 短ければ短いほど判り難く、再利用が認識されるのは、そのサイトに訪問したり、メールを送ってからですよね..
--
次に、最初の疑問点と派生した疑問ですが、ポリシーの摺り合わせが出来ればいいのでは!と思います
ホワイトリストやレーティングなどでポリシーの差異の少ないところを選択できるようになれば良いかも知れません
# OP の評価ポイントが細分化されて、RP はその評価ポイントを利用できれば良いかもしれません
# しかし、限定されたユーザにサービスを提供する RP の評価はどうなるのか判りません
Yahoo! JAPAN の ID の様な場合、URL のスキームからクエリ/フラグメントをのぞく部分までが一意で有るか確認できません
ですが、Yahoo! のフラグメントの様な、単純化された桁の少ない数字などは認識しやすいのに、表示されないので視認できません
一方、OpenID.ne.jp の ID の様な場合、エンドユーザーは URL を一目で確認することが出来ますが、
RP は、その ID を確認した時点で、過去の ID との連続した一意性を確認できるか不明なのでは?と言う点です
# 誤解を恐れずに言えば、過去、Yahoo! JAPAN で系列企業を通じた ID の流出があったと記憶していますが、ID の法則性が不明な以
上、無条件で信用することは出来ないですよね..
## もちろん、現状ではこの様なことはないと考え ID などを登録していますので悪しからず!
どちらも、エンドユーザに誤解を与える場合が有るのではないかと考えてしまいます
また、OP を信用できるか否か?RP を信用してもらえるか否か?に帰結してしまうかも知れません
-----
Cookie などを利用し、「7.1. Initiation 」で言う、User-Supplied Identifier の初期値
を"yahoo.co.jp"などとした場合、最短では、マウスのクリックを二回するだけで認証することが出来ます
ログイン認証の利便性向上には欠かせませんので、これを現在構築中のシステムに組み込もうと思ったのが発端です
今後のInternet Explorer や Mozilla FireFox などのユーザ・エージェントなどもますます便利に使えるようになると
おもいます
-----
# openid-japan.org などには、RP などの構築ガイドなど期待したいです ^^