日向夏特殊応援部隊

俺様向けメモ

OP initiated の認証に関するメモ

個人的なメモです。
前に id:kthrtty がちらっと言ってたことがふと気になったので。

仕様上関連するところ

In indirect communication, messages are passed through the User-Agent. This can be initiated by either the Relying Party or the OP.

間接通信の中で、メッセージは User-Agent を介して行われる。これは RP または OP のいずれからでも開始することが出来る。

If the Claimed Identifier was not previously discovered by the Relying Party (the "openid.identity" in the request was "http://specs.openid.net/auth/2.0/identifier_select" or a different Identifier, or if the OP is sending an unsolicited positive assertion), the Relying Party MUST perform discovery on the Claimed Identifier in the response to make sure that the OP is authorized to make assertions about the Claimed Identifier.

RP が、その時点までに Claimed Identifier をディスカバリによって取得していない(リクエスト中の "openid.identity" が "http://specs.openid.net/auth/2.0/identifier_select"、または異なる identifier、あるいは OP が一方的な肯定アサーションを送ってきた)場合、RP はその Claimed Identifier 上でディスカバリを実行し、OP がその Claimed Identifier に対してアサーションを行う認可があるかどうかを確かめなければならない。

つまりどういうことか

  • OP から間接通信をすることが出来る
  • OP は RP から認証要求をされていない状況で一方的に肯定アサーション (openid.mode=id_res) を RP に送りつけてよい

と言う事なので、OP initiated で RP にログインすると言う枠組みを作る事は可能である事を示唆してる訳ですね。

RP はそういう肯定アサーションが UserAgent 経由で突然やってきた場合に、送りつけられた認証結果から openid.claimed_id に対してディスカバリして、OP Endpoint URL が一致するかどうか、また必要ならば OP Local Identifier が一致するかを検証すればよい訳です。(当然、通常の検証も行った上でですが。)

どんな風に使えるのか

今まで RP から認証が始まるものだと言う思い込みがあった訳ですが、場合によっては OP 上で RP 一覧みたいのがあって、そのボタンを押したらいきなりログインとか、あるいは RP 上ですぐに会員登録出来るみたいなフローとかが作れそうですね。

その場合、RP の受け皿は return_to な訳ですから、ここで RP discovery が使えると。

RP は realm に対するディスカバリの結果として、

<Service xmlns="xri://$xrd*($v*2.0)">
  <Type>http://specs.openid.net/auth/2.0/return_to</Type>
  <URI>http://consumer.example.com/return</URI>
</Service>

といった XRDS 文書を返すわけだが、いわゆる RP 上のログイン用の URI を priority で最大になるよう提示すると言うルールさえあれば、それを OP が見て(ry とか出来そう。

欲を言えば、ここに SREG やら AX などで RP のその return_to ではこういう属性が欲しい〜なんて提示も出来れば OP initiated の認証開始がより便利になるかもしれない。