OpenID ABCで使われるSimple Web Discovery(SWD)とは


Simple Web Discoveryとは

Simple Web Discovery (SWD) defines a HTTPS GET based mechanism to
discover the location of a given type of service for a given
principal starting only with a domain name.

draft-jones-simple-web-discovery-00 - Simple Web Discovery (SWD)

OpenID Auth 2.0(not OAuth 2.0)では、YadisというDiscoveryのしくみを利用しています。
今、策定されているOpenID ABCでは、新たにこのSWDによってOP Endpointやその他のLocationを取得するようになります。
http://lists.openid.net/pipermail/openid-specs-ab/Week-of-Mon-20110411/000352.html

4行で説明してもよくわからない

  • SWD用エンドポイントは.well-known/simple-web-discovery
  • リクエストはHTTPS+GETアクセス、レスポンスはJSON形式
  • 必要なパラメータは対象HOST、エンティティを特定するPrincipal、サービスの種類を指定するServiceの3つ
  • レスポンスの形式で別のエンドポイントにリダイレクトさせることも可能

テストツールを使って流れを体験

実際にSWDのリクエストを送ってみるテストツールを用意しました。
http://swdtool.phper.jp/swd.php
とはいえどこもSWDに対応してるサービスなんてないので、自分のレンタルサーバにサンプルレスポンスを返すように実装しました。

OpenID ABCにおけるユースケースを紹介します。

OP選択→SWDによりOP Endpoint取得

OpenID 2.0でYahoo!を使う!mixiを使う!って選択したときのユースケースですね。
principalにOPのhostnameが指定されます。

SWDパラメータ

SWDエンドポイントへのリクエス

URL :
https://r-weblife.sakura.ne.jp/.well-known/simple-web-discovery?
principal=r-weblife.sakura.ne.jp&
service=http%3A%2F%2Fopenid.net%2Fspecs%2Fcc%2F1.0%2Fop

レスポンス

{
"location":
["https://r-weblife.sakura.ne.jp/swd/op"]
}

メールアドレス→SWDによりOP Endpoint取得

WebFingerのように、EmailからのDiscoveryで使うこともできます。
principalにユーザーのEmailが指定されます。

SWDパラメータ

SWDエンドポイントへのリクエス

URL :
https://r-weblife.sakura.ne.jp/.well-known/simple-web-discovery
?principal=user%40r-weblife.sakura.ne.jp
&service=http%3A%2F%2Fopenid.net%2Fspecs%2Fcc%2F1.0%2Fop

レスポンス

{
"location":
["https://r-weblife.sakura.ne.jp/swd/op"]
}

Identity URL→SWDによりOP Endpoint取得

OpenID 1.0時代から使われている、ユーザーが自分を特定するURIを指定して、そこからエンドポイントを取得することも可能です。

SWDパラメータ

SWDエンドポイントへのリクエス

URL :
https://r-weblife.sakura.ne.jp/.well-known/simple-web-discovery
?principal=https%3A%2F%2Fr-weblife.sakura.ne.jp%2Fuser
&service=http%3A%2F%2Fopenid.net%2Fspecs%2Fcc%2F1.0%2Fop

レスポンス

{
"location":
["https://r-weblife.sakura.ne.jp/swd/op"]
}

最後にもうひとつ、リダイレクトする場合を見てみましょう。

別のSWDエンドポイントにリダイレクトしてから取得

SWDパラメータ

SWDエンドポイントへのリクエス

https://r-weblife.sakura.ne.jp/.well-known/simple-web-discovery
?principal=redirect%40r-weblife.sakura.ne.jp
&service=http%3A%2F%2Fopenid.net%2Fspecs%2Fcc%2F1.0%2Fop

別のエンドポイントへのリダイレクトを意味するレスポンス

{ "SWD_service_redirect":
{"location":"https://r-weblife.sakura.ne.jp/swd/swd_server.php"}
}

リダイレクト先のSWDエンドポイントへのリクエス

https://r-weblife.sakura.ne.jp/swd/swd_server.php
?principal=redirect%40r-weblife.sakura.ne.jp
&service=http%3A%2F%2Fopenid.net%2Fspecs%2Fcc%2F1.0%2Fop

レスポンス

{
"location":
["https://r-weblife.sakura.ne.jp/swd/op"]
}

どうでしょう。シンプルな実装ですね。
今後、OpenID ABCで使えそうなDelegation,複数同時のDiscoveryなど様々な仕様が策定されていくと思いますので、注目していきましょう。