2010年3月25日

OpenID/OAuth

OpenID AXによるYahoo!プロフィール情報の取得

  • このエントリーをはてなブックマークに追加

こんにちはこんにちは!IDプラットフォームの@tohaeです!
10分で作るYahoo! OpenID RPから約一年たちましたが、3/24にめでたくYahoo! OpenIDをリニューアルしました。世間ではtwitterが流行し、twitterのOAuthを使ってシングルサインオンを実現するサイトが多数生まれていますが、今回のリニューアルを機にたまにはOpenIDのことも思い出してあげてください。
今回のOpenIDのリニューアルではいくつかのバグ修正、iPhone用の画面の出し分けなどとともに、次の拡張仕様に対応しました。

  • ポップアップ対応など、UX向上のための拡張仕様であるOpenID User Interface Extension(以下UI)
  • ユーザーの属性情報を取得する拡張仕様であるAttribute Exchange(以下AX)

今回の記事ではAXの簡単な説明と、サンプルコードを用いてYahoo!プロフィールに登録してあるユーザーの属性情報を取得してみます。

AXについて

AXとはOpenIDの拡張仕様の一種で、ユーザーの名前や住所情報と言ったどのサイトでも用いるような簡単なユーザーの属性情報をRP 1 が扱うことが可能になります。
同様の拡張仕様にSREGというものがありますが、SREGはあらかじめ定義された属性情報しか受け渡しができません。
それに対してAXはOPが拡張して特殊な属性情報を渡すことも可能ですし、SREGで提供できる情報はAXでもすべて提供できます。
このような理由からYahoo! JAPANのOpenIDはAXのみに対応しています。

今回のOpenIDのリニューアルで、Yahoo! JAPANでは下記の情報をRPに提供します。

schema Y!プロフィール上の属性
http://axschema.org/namePerson/friendly 表示名
http://axschema.org/namePerson/first
http://axschema.org/namePerson/last
http://axschema.org/birthDate/birthYear 生年
http://axschema.org/person/gender 性別(M or F)
http://axschema.org/media/image/default メインで設定している画像(Y!アバターを除く)

※ 属性情報の詳細仕様についてはデベロッパーネットワークのOpenID拡張仕様についてのドキュメントを参照ください。

「mixiのOpenIDを使うとニックネームが取れるのにYahoo!だと何で取れないの?ムキー」って言う人もこれで安心ですね!

サンプル

前回はサンプルコードをPHPで作成しましたが、今回はPythonのWebフレームワークであるDjangoを用いて作成します。
Djangoを使ってOpenIDを扱うにはdjango-openidやDjango-Socialauthといったライブラリがありますが、今回はYahoo!Incが提供するライブラリ 2 を元に実際に動かせるサンプルを作成しました。以下からダウンロードできます。
ZIPファイルダウンロード(26KB)

動かしてみる

以下のサンプルは以下のような環境で動作確認を行いました。

  • Python2.6.5
  • Django1.1
  • SQLite3

これらのインストールは完了しているものとして今回は話を進めさせていただきます。
サンプルの動作確認は下記のコマンドを実行する必要があります。

# python-openid のインストール
$ easy_install python-openid
# サンプルをダウンロード
$ curl -L http://cgi.geocities.jp/ydevnet/techblog/sample/20100325/
download.php > djopenid.zip $ unzip djopenid.zip $ cd djopenid # データベース作成 $ python manage.py syncdb # サーバを起動 $ python manage.py runserver localhost:8000

これで作業は完了です。
http://localhost:8000/consumerにアクセスしてみると下記のような画面が出力されます。

ログインボタンをクリックして、Yahoo!にログインを行うと下記のような同意画面が出力されます。

Yahoo! JAPANのOpenIDでは、RPが要求してきた属性情報に対しユーザーが渡しても良いと判断したもののみを渡す仕様です。
よって、この画面ですべてチェックを入れて同意を行うと、下記のように出力されるはずです

解説

どのようにしてAXのリクエストを構築しているかですが、これはconsumer/view.pyの下記の部分で行っています。

 41         # Add Attribute Exchange request information.
 42         ax_request = ax.FetchRequest()
 43         # XXX - uses myOpenID-compatible schema values, which are
 44         # not those listed at axschema.org.
 45         ax_request.add(ax.AttrInfo('http://axschema.org/media/image/default',required=False))
 46         ax_request.add(ax.AttrInfo('http://axschema.org/birthDate/birthYear',required=False))
 47         ax_request.add(ax.AttrInfo('http://axschema.org/person/gender',required=False))
 48         ax_request.add(ax.AttrInfo('http://axschema.org/namePerson/friendly',required=False))
 49         ax_request.add(ax.AttrInfo('http://axschema.org/namePerson/first',required=False))
 50         ax_request.add(ax.AttrInfo('http://axschema.org/namePerson/last',required=False))
 51
 52         auth_request.addExtension(ax_request)
 53

RPが必要なスキーマのURLを随時追加していく形になります。OpenID Provider 3 によって渡している属性情報が異なるため、実際に使う場合にはこの部分に追加または削除をすると良いでしょう。
レスポンスに関しても同様です。getSingleメソッドの第二引数にはデフォルトの値を入れます。

108                 ax_items = {
109                     'image': ax_response.getSingle('http://axschema.org/media/image/default',""),
110                     'birth_year': ax_response.getSingle('http://axschema.org/birthDate/birthYear',""),
111                     'gender': ax_response.getSingle('http://axschema.org/person/gender',""),
112                     'nickname': ax_response.getSingle('http://axschema.org/namePerson/friendly',""),
113                     'firstname': ax_response.getSingle('http://axschema.org/namePerson/first',""),
114                     'lastname': ax_response.getSingle('http://asschema.org/namePerson/last',""),
115                     }

まとめ

今回はリニューアルしたYahoo! OpenIDのAXを使ってプロフィール情報を取得するサンプルをお見せしました。
RP側の初期登録画面でAXで取得したユーザ情報を予めフォーム値として表示しておけば,ユーザの入力の手間が少なくなりRP登録時のドロップ率軽減が見込めるハズです.
次回はリニューアル時にもうひとつ追加した機能である、OpenID UI Extension popupについてご説明させていただきたいと思います。

Footnotes
Reference Notes
1 RPについては前回の記事をご確認ください
2 http://github.com/yahoo/yos-social-python
3 たとえばmixiではhttp://axschema.org/namePerson/friendlyのみ

関連記事
10分で作るYahoo! OpenID RP
OpenID UI Extensionによる、ユーザーエクスペリエンスの向上

Yahoo! JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。

  • このエントリーをはてなブックマークに追加