いますぐ使えるOpenID

第3回 OpenIDプロトコルの特徴-DiscoveryとSREG

この記事を読むのに必要な時間:およそ 5 分

OpenIDの拡張領域

OpenIDは拡張領域(Extension)を定義できるようになっています。 拡張領域を使うことで,OpenIDのアカウント名を渡すだけでなく他の情報のやり取りも可能になります。 以下のような拡張領域が定義されています。

PAPEはOPにおける利用者の認証レベルを表すものです。 RPがOPに対して,例えばパスワードと一緒にデジタル証明書を用いて利用者を認証することを要求することができます。 RPが重要なデータを扱うサービスの場合は,OPに対して強固な認証を要求するといった使い方が想定されています。 ただし,本当にRPが要求したレベルの認証をOPが行っているかどうかは,RPには分かりません。 OPが「デジタル証明書で利用者を認証しました」とウソをつきながら,実はパスワードで認証しているということもあり得ます。 そのため,PAPEは信頼できるOPに対して使うことになるでしょう。

SREGとAXは,どちらも利用者の名前やメールアドレスなどの属性情報をOPに対して要求するものです。 AXはより汎用的な属性情報を扱えるようになっています。 これらの拡張を使うことで,ユーザ登録時の情報の入力を省くことができるというメリットがあります。 今回は,SREGを用いて利用者の名前とメールアドレスを取得するサンプルを試してみます。

SREGを使って利用者の名前とメールアドレスを取得する

前回動かしたRailsのサンプルには,SREGを使うためのインタフェースが用意されています。 ですが,利用者の情報を他のサイトに伝えるということから,SREGに対応しているOPはそれほど多くありません。 discoverコマンドを使うことで,OPがSREGに対応しているかどうかを確認することができます。 Yahoo!やはてなはSREGに対応していないので,ここではmyopenid.comというSREGに対応したOPを使います。 discoverコマンドで確認すると,OpenID2.0とSREG1.0に対応していることが分かります。

$ ./discover http://myopenid.com
==================================================
Running discovery on http://myopenid.com
 Claimed identifier: http://www.myopenid.com/
 Discovered services:
  1.
     Server URL  : http://www.myopenid.com/server
     Type URIs:
       * http://specs.openid.net/auth/2.0/server 
       * http://openid.net/sreg/1.0

筆者はあらかじめmyopenid.com にアカウントを作成し,ニックネームとメールアドレスも登録しておきました。

前回も利用したRailsのサンプルを起動して,OpenIDのアカウント名を入力する画面にて「Request registration data」というチェックボックスをオンにするとOpenIDの拡張領域にSREGのパラメータが設定されます。

図2

コードを見てみましょう。SREGの要求パラメータはOpenID::SReg::Requestクラスを使って管理します。 OpenID::SREG::Requesのオブジェクトを作り,フィールドに要求する値を設定します。 そして, OpenID::Requestクラスのオブジェクトに対して,add_extensionメソッドを呼び出してOpenID::SReg::Requestオブジェクトを登録します。 この例では,メールアドレスとニックネームを必須項目として要求しています。

25  sregreq = OpenID::SReg::Request.new
26  # required fields
27  sregreq.request_fields(['email','nickname'], true)
28  # optional fields
29  sregreq.request_fields(['dob', 'fullname'], false)
30  oidreq.add_extension(sregreq)

OPであるmyopenid.comのログイン画面では,ログイン後にメールアドレスやニックネームをRPへと渡してよいかの確認が行われます。

ここでmyopenid.comが面白いのは,複数の登録データを「ペルソナ」として選択できるようになっていることです。 Yahoo!がRPに渡すIDを選べるようになっていたように,myopenid.comではRPに渡すメールアドレスやニックネームを選ぶことができます。

図3

ログインが終わりOPからRPへと戻ってくると,OPに登録していたニックネームやメールアドレスがRPの画面に表示されています。 これによってRP でのユーザ登録時の情報を入力する手間を省くことができます。

図4

ソースコードを見てみましょう。 まず,OpenIDのレスポンスを管理するOpenID::Responseオブジェクト(oidresp)からOpenID::SReg::Responseオブジェクトを生成します。

    # OpenID::Response から SREG レスポンスのオブジェクトを生成
71  sreg_resp = OpenID::SReg::Response.from_success_response(oidresp) 

OPから送られてきたデータは,ハッシュ形式で取り出すことができます。 例えば,メールアドレスはsreg_resp.data['email']で取得できます。

    # SREG レスポンスのキーと値を取得
77  sreg_resp.data.each {|k,v|
78   sreg_message << "
#{k}: #{v}" 79 }

SREでは,OPは利用者から預かった情報をRPへ渡すことになるので,慎重に利用する必要があるでしょう。 特に,RPやOPにおいてログイン画面などで利用者に対する周知をしっかり行わないと,⁠知らないうちに個人情報が漏れた!」と誤解されてしまうかもしれません。 そのためか,多数の利用者を抱えるOPにて,SREGを提供しているところはまだあまりありません。

しかし,SREGやAXは可能性を秘めている仕組みですので,面白い使い方が出てくることを期待したいです。

終わりに

今回はOpenIDの内部の仕組みとして,利用者が入力したOpenIDアカウント名(User-Supplied Identifier)からOPのエンドポイント(OP Endpoint URL)を見つけるdiscoveryや,拡張領域を使ってメールアドレスなどを交換するSREGについて説明しました。 内部の仕組みは複雑なところがありますが,これらの面倒な処理はOpenIDライブラリが担当してくれます。

次回はいよいよ,OpenIDを使ったサービスを作ってみることにしましょう。

著者プロフィール

松岡浩平(まつおかこうへい)

NTTコムウェア株式会社にて,オープンソースを活用した認証システムの開発を担当しています。ここ2年は,情報セキュリティ大学院大学に通学しながら,OpenIDを使った認証システムについて研究していました。