Spec Catch-Up for OpenID UI Extension

みなさん、OpenIDを忘れていませんか?
OpenSocialと同様に、OpenIDも日々進化しているんですよ。

ということで、ポップアップ周りに絡むUI Extensionは最近どうなってるのかなとキャッチアップしてみました。
まず、MLなどで最近のトピックを探してみましょう。
こんなの見つけました。

Yahoo!のAllen Tomと他の人たちが色々しゃべっているので、最新版のDraftを見てみます。

0.5で追加されたところがあるようです。

■ icon対応

6. Requesting Display of RP icons in the OP Approval UI

When requesting authentication, the Relying Party MAY indicate to the OpenID Provider the availability of graphical resources to represent the Relying Party brand at the OpenID Provider's approval UI. This is indicated by including the following parameter:

openid.ui.icon
REQUIRED. Value: "true"

Implementers' Draft: OpenID User Interface Extension 1.0 - DRAFT 0.5

OP上のログイン/同意/確認画面で、RPを表すグラフィカルリソースを表示させたいときにこのパラメータをリクエストに含むというお話のようです。
OAuthまたはHybridの話でも何度か取り上げたことがある、OpenID OP Best Practiceを思い出してください。
facebook connect,MySpaceのUIなどで見られる「こことここでデータがやり取りされますよ」的な図のことですね。

OpenID Wiki / Details-of-UX-Best-Practices-for-OPs

OAuthではConsumerKeyを登録/発行する際にConsumerの情報を入力させるでしょう。
その際に、ログイン/同意/確認画面で表示するアイコン画像を事前に登録させることができます。
MySpaceのOAuthなどはそのようなつくりになっていると思います。

しかし、OpenIDでは「OP-RP間の事前登録なし」が前提なので、画像出そうと思ったらOPはRP DiscoveryとかでRP上のXRDSドキュメントを見て画像を取得できるようにしようという話ですね。

In order to retrieve the indicated graphical resources, the OpenID Provider performs discovery on the Relying Party,
as specified in [OpenID 2.0].
The RP SHOULD indicate the location of the graphical resource by adding an entry to its XRDS document:

Implementers' Draft: OpenID User Interface Extension 1.0 - DRAFT 0.5

フローはこんな感じでしょうか。

ポップアップってうまく表現できない。。。

RP側はこんな記述をしておけばいいようです。

<Service xmlns="xri://$xrd*($v*2.0)">
  <Type>http://specs.openid.net/extensions/ui/icon</Type>
  <URI>http://consumer.example.com/images/image.jpg</URI>
</Service>

<Service xmlns="xri://$xrd*($v*2.0)">
  <Type>http://specs.openid.net/extensions/ui/icon</Type>
  <URI>http://consumer.example.com/favicon.ico</URI>
</Service>

画像の特定に失敗したらfavicon使うみたいなことも書いてあるので興味がある方はじっくり見てみてください。

Googleの実装

この仕様考えていてUI Extension実装してるのはGoogleですよということで、9/x時点のGoogleの対応状況を見てみました。
まずはXRDSの中身から。

$ curl "https://www.google.com/accounts/o8/id"
<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">
  <XRD>
  <Service priority="0">
  <Type>http://specs.openid.net/auth/2.0/server</Type>
  <Type>http://openid.net/srv/ax/1.0</Type>
  <Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type>
  <Type>http://specs.openid.net/extensions/ui/1.0/icon</Type>
  <Type>http://specs.openid.net/extensions/pape/1.0</Type>
  <URI>https://www.google.com/accounts/o8/ud</URI>
  </Service>
  </XRD>
</xrds:XRDS>

"http://specs.openid.net/extensions/ui/1.0/mode/popup"
→ポップアップ対応

"http://specs.openid.net/extensions/ui/1.0/icon"
→上で説明したRPアイコン対応

きましたこちら、さっそく、Googleはアイコン対応しているようです。
後で述べますが、自分の指定した画像を表示させることは確認できませんでした。

lang-prefには対応していないようです。

■ Demo

では、画面どうなるか見てみましょうということで、以下のようなページを作りました。

http://r-weblife.sakura.ne.jp/php-openid-popup-example/

  • Google : ポップアップ対応
  • MySpace : 特にUI Extension対応してないけどもともと画面小さい
  • Yahoo! : 比較対象。画面でかいからや!画面でかいから比べられるんや!

Googleの画面を比べてみましょう。
まずはUI Extension使ってない場合。

まずはmode=popupにした場合。

さらに、icon=trueにした場合。

アイコン見えますが、FFで見たら文字とかぶってました。。。
他のブラウザでは試していません。
また、return_toをDiscoveryされたときのレスポンスにXRDSを示してその中にアイコンのURLを指定してみたりしましたが、残念ながら何も起こらず。。。もう少し調べてみます。

Googleへのリクエストをmode=popup,icon=trueにしたときの動作確認用のコードはここ。
http://github.com/ritou/php-openid-popup-example/tree/master

また、Googleでは普通にログインして同意しちゃうと"次回から入力を省略"チェックボックスONになって次回から画面でなくなるので、"Disable Sign In Status"っていうリンクをつけておきました。

■ Example Use of Experimental Mode

仕様の付録としていろいろ書いてあります。(長いので引用は省略)

  • 現在、checkid_immediate modeを利用しようと思ってもRPはOP上でログインしているユーザーがいるかわからない
  • checkid_immediate modeが失敗したとき、RPはOP上で誰もログインしていないのか、ログインしているけどcheckid_immediateモードを拒否しているのかわからない

これだとRPがUXを最適化するのが難しいですねと。
そこで、RPは以下のリクエストパラメータをcheckid_immediateの要求に含めましょうという話になりました。

openid.ns.ui
REQUIRED. Value: "http://specs.openid.net/extensions/ui/1.0"
openid.ui.mode
REQUIRED. Value: "x-has-session".

で、「ログインしてるけどcheckid_immediateモードじゃない」って場合は、OPは"setup_needed"のレスポンスに同じパラメータを含みます。
逆に、「ログインしていない」場合は、openid.ns.uiしか返しませんという感じですね。
この辺については、いろいろ議論されている途中っぽいので、今回は流しておきます。

今後もこの拡張仕様はチェックしていきたいと思います。

■ これ以外のOpenID関連で気になるところ

OpenIDといえば、時間があるときに@_natさんが書いているArtifact Bindingについても何か考えたいと思っています。
OpenID Wiki / OpenIDwithArtifactBinding