2012年11月11日日曜日

OpenID Attribute Exchange

OpenID4Java付属のサンプルアプリを使用し、Yahoo!JapanとOpenID認証する」で使用したRPサンプリアプリケーションでは、OPに認証要求しか実施していない。
今回は、OPからユーザの属性情報も取得できるように、RPサンプルアプリケーションをちょこっと改造する。

OpenID2.0規約として、ユーザの属性情報を取得する仕様は、以下の2つが規定されている。

・Simple Registration Extension
→認証要求のプロトコルの中に、要求する属性名を指定する方法。

・Attribute Exchange
→認証要求とは別のプロトコルを使用し、属性取得を要求する方法。

OPとして使用するYahoo!Japanでは、以下のユーザの属性情報を取得できる。

http://developer.yahoo.co.jp/other/openid/extension.html

今回は、「Attribute Exchange」を使用し、性別情報を取得する。

■ OpenID4Java RPサンプルアプリケーションのロジック
サンプルアプリケーションでは、いくつかjspファイルがあり、「consumer_redirect.jsp」で認証要求を作成している。ソースをみてみると、以下のようになっている。
Attribute Exchangeを実装するには、認証要求の作成後に、ロジックを追加する必要がある。

【consumer_redirect.jspから一部抜粋】
---------------------------------------------------------------

(・・・中略・・・)

// RPの機能を提供するConsumerManagerをnew
ConsumerManager newmgr=new ConsumerManager();
// アソシエーションフェーズで使用するオブジェクトをセット
newmgr.setAssociations(new InMemoryConsumerAssociationStore());
// リプレイ攻撃を防ぐNonce値をセット
newmgr.setNonceVerifier(new InMemoryNonceVerifier(5000));


(・・・中略・・・)


// perform discovery on the user-supplied identifier
// OPのディスカバリ
List discoveries = manager.discover(openid);

// attempt to associate with an OpenID provider
// and retrieve one service endpoint for authentication
// OPとのアソシエーション
DiscoveryInformation discovered = manager.associate(discoveries);

// store the discovery information in the user's session
session.setAttribute("openid-disco", discovered);

// obtain a AuthRequest message to be sent to the OpenID provider
// 認証要求の作成
AuthRequest authReq = manager.authenticate(discovered, returnToUrl);

(・・・中略・・・)
---------------------------------------------------------------

■ 「consumer_redirect.jsp」の改造
「consumer_redirect.jsp」において、属性情報の要求クラスに相当するFetchRequestクラスを使用する。Yahoo!Japan(OP)からは、性別(http://axschema.org/person/gender)を取得するために、addAttributeメソッドで要求対象の属性情報を設定する。

---------------------------------------------------------------

// Attribute Exchangeリクエストを作成
FetchRequest fetch = FetchRequest.createFetchRequest();
// 属性情報の設定
fetch.addAttribute("gender",                                           // attribute alias
                         "http://axschema.org/person/gender",    // type URI
                          true);                                                // required

// attach the extension to the authentication request
// 認証要求にセット
 authReq.addExtension(fetch);

---------------------------------------------------------------

上記を改造した後、marvenコマンドでwarファイルを再作成する。
OPで認証した後に、以下のような、OpenIDに加えて、属性情報をRPに通知してよいかの同意画面が表示される。


また、OPからRPに通知されたURLをみてみると、以下のように属性情報(gender)が通知されていることがわかる(下線部分)。

http://localhost:8080/simple-openid/consumer_returnurl.jsp?openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.mode=id_res&openid.return_to=http%3A%2F%2Flocalhost%3A8080%2Fsimple-openid%2Fconsumer_returnurl.jsp&openid.claimed_id=https%3A%2F%2Fme.yahoo.co.jp%2Fa%2F***&openid.identity=https%3A%2F%2Fme.yahoo.co.jp%2Fa%2F***&openid.assoc_handle=***&openid.realm=http%3A%2F%2Flocalhost%3A8080%2Fsimple-openid%2Fconsumer_returnurl.jsp&openid.ns.ax=http%3A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0&openid.ax.mode=fetch_response&openid.ax.value.gender=M&openid.response_nonce=***&openid.signed=assoc_handle%2Cclaimed_id%2Cidentity%2Cmode%2Cns%2Cop_endpoint%2Cresponse_nonce%2Creturn_to%2Csigned%2Cax.value.gender%2Cax.type.gender%2Cns.ax%2Cax.mode%2Cns.pape%2Cpape.auth_policies%2Cpape.auth_level.ns.nist%2Cpape.auth_level.nist&openid.op_endpoint=https%3A%2F%2Fopen.login.yahooapis.jp%2Fopenid%2Fop%2Fauth&openid.ax.type.gender=http%3A%2F%2Faxschema.org%2Fperson%2Fgender&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.pape.auth_policies=http%3A%2F%2Fschemas.openid.net%2Fpape%2Fpolicies%2F2007%2F06%2Fnone&openid.pape.auth_level.ns.nist=http%3A%2F%2Fcsrc.nist.gov%2Fpublications%2Fnistpubs%2F800-63%2FSP800-63V1_0_2.pdf&openid.pape.auth_level.nist=0&openid.sig=***


0 件のコメント: