2009年3月 5日

OpenID/OAuth

10分で作るYahoo! OpenID RP

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

こんにちは。システム統括部脇阪です。
「OpenID関係の記事を24時間書く」という依頼の元、がんばって何か書こうと思います!
OpenID関連の記事ということで、今回はYahoo! JAPANのOpenID対応RPを構築する方法を紹介したいと思います

RPって何?

RPとはRelying Partyの略で、OpenIDでログインできるサイトのことです。日本ではsmart.fm(旧iKnow!)が有名です。
ちなみにOpenIDを発行しているYahoo! JAPANやmixi,livedoorなどのことはOP(OpenID Provider)と言います。今回はOPに関しては取り扱いません。

RPになるメリットって?

ユーザーごとに適したサービスを提供するには、サイトごとにID登録を行ってもらう必要があります。しかしID登録の敷居は高く、ユーザー数がまだ少ないサイトやこれから新規に立ち上げる予定のサイトにとって、自前のID登録のみで新規にユーザーを獲得するのは敷居が非常に高いのではないでしょうか。

そこでOpenIDの出番です。
OpenIDでのログインに対応させた場合、ターゲットユーザーをOpenID対応しているOPの全ユーザーの数だけ増やせることになります。ユーザーから見ても、新しくIDとパスワードを覚える必要がないですし、普段使い慣れているIDでログインして利用できるサービスなので使ってみようという気持ちが生まれやすくなると思います。

また開発者にとっては、認証管理の大部分をOPに任せることができ、開発コストの削減でメインのサービス部分の開発に時間を注ぐことができます。

そんなOpenIDですが、メリットだけではなくデメリットもいくつかあります。
例えばOP側が何らかの障害が発生してRPへのログインが正常に行われないようなことが起きないとは限りません。また、RPの認証のセキュリティ強度もOP次第で下がってしまうことになるので、ユーザーは信頼性の高いOPを選択する必要があります。

またOpenIDの認証方法には

      ・フォームに自分のOpenIDを入力
      ・利用するOPを入力

の二通りの方法がありますが、最近は「利用するOPを入力」のUX(ユーザーエクスペリエンス)を改善するために、「利用するOPを選択」する方法が一般的になりつつあります。こうすることでユーザーの入力回数を減らし、RPがユーザーに信頼性の高いOPを選択させることが可能になります。Yahoo! JAPANをはじめとする主要なOPは「ログインボタン」の画像を提供していますので、今回はそれを使ってサンプルコードを動かしたいと思います

作ってみよう!

OpenIDのプロトコルは少々複雑ですが、幸いなことにさまざまな言語で使えるライブラリが存在しているので、開発者は仕様に沿って1から機能を開発する必要はありません。もちろん仕様を知っておくことに越したことはありませんが...
たとえば、PHP,Ruby,Pythonであれば、http://openidenabled.com/にて1.0と2.0に対応したライブラリが公開されていますし、PerlであればNet::OpenIDありますし、Javaにもopenid4javaというのがあるようです。
このようにプログラミング言語はいくつか選択肢がありますが、今回はYahoo! JAPANで多く使われているPHPでRPを作成しようと思います。

まずは前述したhttp://openidenabled.com/から、PHP用のライブラリをダウンロードします。Yahoo! JAPANはOpenID2.0ですので、2.0用のライブラリを使用します。現時点での最新版は2.1.2です

$ wget http://openidenabled.com/files/php-openid/packages/php-openid-2.1.2.tar.bz2
$ tar jxvf php-openid-2.1.2.tar.bz2
$ ls php-openid-2.1.2/
Auth CHANGELOG CHANGES-2.1.0
COPYING NEWS README README.Debian
Tests admin contrib doc examples

解凍されたディレクトリの中身を見てみましょう。
Authディレクトリの中に、OpenIDのライブラリがあります。これらを利用すればRPにもOPにもなれるのですが、今回は「10分で作るRP」と言う事に(勝手に)したので、examplesの中にあるサンプルコードを流用します。すみませんすみません><
まずはライブラリ本体とサンプルコードを作業用ディレクトリにコピーします

$ cp -r Auth exaples/consumer/try_auth.php examples/consumer/finsh_auth.php examples/common.php ~/(作業用ディレクトリ)

次にログイン画面兼ログイン後に遷移されるindex.phpを作成します。コードは以下のようにします

※画像はRP側のサーバーに配置してください
画像リンクの遷移先はサンプルコードであるtry_auth.phpでパラメータとしてopenid_identifierとactionを指定する必要があります。前者はyahoo.co.jpやmixi.jpなどOPのURLを入力し、後者はverifyを指定します。

index.phpにアクセスしてみると、以下のようなページが表示されます

20090305_1


「Yahoo! JAPAN IDでログイン」ボタンをクリックすると、Yahooのログイン画面に遷移し同意画面にて同意すると、finish_auth.php(common.phpのgetReturnTo関数の中で指定されたファイル)が呼び出されてレスポンスを受け取り、最終的にindex.phpがincludeされます。

20090305_2


ここで表示されているhttps://me.yahoo.co.jp〜で始まるURLがユーザーのOpenIDとなりますので、開発者はこのIDにユーザーの情報を紐付けたり、Sessionに格納したり、DBに保存したりすることでさまざまなサービスを展開することができるようになります。ちなみに、サンプルコードではOpenIDは$esc_identityという変数に格納されています。

「Yahoo! JAPAN IDでログイン」ボタンは、Yahoo!デベロッパーネットワークにていくつかデザインが選べるようになっていますので、サイトのデザインにあったものを選ぶことができます。サンプルは下記URLから
http://developer.yahoo.co.jp/other/openid/loginbuttons.html

最後に

今回はYahoo!のOpenIDに対応したRPの構築方法について簡単に説明させていただきました。
実際に運用しようとすると、他のOPに対応するためにOpenID入力フォームを用意したり、OpenIDと個人情報の紐付けなどを行う必要があると思いますが、そこは対応したいサイトのコンセプトや、開発者の腕次第だと思います。
Yahoo!ではモバイル版OpenIDやOAuthハイブリッドなど新しい技術の調査を行っています。今後はそういった技術の調査結果などを載せていきたいと思います。



Yahoo!デベロッパーネットワークはこちら 関連記事
OpenID AXによるYahoo!プロフィール情報の取得
OpenID UI Extensionによる、ユーザーエクスペリエンスの向上

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

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