第5回 OpenIDを実装したソースコードを読もう
倉貫 義人
松村 章弘
TIS株式会社
SonicGarden
2009/6/3
優れたプログラマはコードを書くのと同じくらい、コードを読みこなせなくてはならない。優れたコードを読むことで、自身のスキルも上達するのだ(編集部)
OpenIDでWebの認証を便利に実現
前回までは、Ruby on Railsの基本部分についてコードリーディングを行ってきました。
今回からは、より魅力的なWebアプリケーションを実現するために必要なさまざまな技術をRailsで活用したソースコードを読むという、さらに実践的な内容に入っていきます。
今回取り上げる技術要素はOpenIDです。GoogleやYahoo!、mixiなどの大手サービスがOpenIDに対応したことで話題になったので、聞いたことがある方は多いのではないでしょうか。
OpenIDとは、とある1つのIDを持っていれば、複数のWebアプリケーションで認証情報を共有できる仕組みです。OpenIDの仕様に則って作られたWebアプリケーションであれば、ユーザーはそれぞれのWebアプリケーションに認証情報を登録する必要がなくなるため、とても便利になります。
Webアプリケーションを提供する側も、アプリケーション側で認証情報を管理する必要はなくなるのはセキュリティ面での懸念が減り、機能の開発に集中できるメリットがあります。
OpenIDは、その名のとおり特定企業にロックインされないオープンな仕様になっており、どのアプリケーション提供者でも採用できるようになっています。OpenIDの仕様そのものは、OpenID Foundationによって策定されています。現在の最新バージョンは2.0です。
オープンな仕様であるため、各種プログラミング言語で使えるライブラリなどが多く存在している点もOpenID採用を後押ししてくれています。今回紹介するSKIPにおけるOpenID実装でも、すでに存在していたOpenIDのライブラリやアプリケーションを活用しています。
関連リンク: | |
OpenID Authentication 2.0 http://openid.net/specs/openid-authentication-2_0.html |
OpenIDについて
コードリーディングに入る前に、OpenIDの仕組みについて簡単に紹介しておきます。本連載は、Railsコードリーディングが主体なので、あまり詳しくは説明しません。詳細を知りたい方は、以下の記事を参考にしてください。
関連記事: | |
OpenIDの仕様と技術 http://www.atmarkit.co.jp/fsecurity/index/index_openid.html |
OpenIDでは、あちらこちらのWebアプリケーションで認証情報を持たなくても良いことが、利用者にとってもWebアプリケーション提供者にとっても便利なメリットです。
ただし、認証情報をバラバラに持たない代わりに、どこか1カ所で管理する必要があります。それが、OpenIDにおける認証局になります。OpenIDでは、この認証局のことをOpenID Provider(OP)と呼んでいます。
利用者は、そのOP上でOpenIDにおける自分自身を識別するIDを持つことになります。その利用者を一意に識別するIDはOpenID Identifierと呼ばれ、URLで表現されます。一方、Webアプリケーション提供者の提供する、認証情報を持たずにOPの認証情報を利用するアプリケーションのことを、Relying Party(RP)と呼びます。
OpenIDにおける登場人物をまとめると、以下のようになります。
- OpenID Provider(OP)
- OpenIDにおける認証情報を管理するWebアプリケーション。利用者の情報を管理する必要があり、OpenIDの利用者はOPでログイン処理をすることで、OpenID認証が行われる(ログインの仕組みやデータ管理についてはOpenIDでは規定されていない)。GoogleやYahoo!、mixiなどが、利用者のOPとして使えるように対応している。
- Relying Party(RP)
- OpenIDにおける認証情報を持たずに、機能だけを提供するWebアプリケーション。認証に必要な情報や認証処理はすべてOPに任せることができる(OpenIDの仕様に則っていれば、言語やプラットフォームは問わない)。smart.fmなどが、RPとしてOpenIDでログインできるように対応している。
- Webアプリケーション利用者
- OpenIDに準拠したRPのWebアプリケーション利用者。RPを利用するためには、mixiなどのOPにてユーザー登録をして、OpenID Identifierを所持している必要がある。ただし、OpenID2.0からは必ずしもOpenID Identifierを覚えていなくてもよくなり、OPを指定するだけでよくなった。
これらの登場人物が出てくる利用の流れは以下の図になります(今回の説明のためだけに簡略化しています)。
OpenIDについての基本的な動作の仕組みは以上です。ここからは、コードリーディングの中で、理解を進めていきましょう。今回も、オープンソースの社内SNSである「SKIP」を使って、OpenIDをRailsアプリケーションで使う際の実際のソースコードを読んでいきます。
関連リンク: | |
オープンソース「SKIP」 http://www.openskip.org/ |
SKIPバージョン1.1リリースしました!
2009年5月1日に、本連載でずっと題材にしてきた社内SNS「SKIP」のバージョン1.1がリリースされました。2008年にバージョン1.0を公開して以来、初のメジャーバージョンアップになります。主な機能の拡張は、以下の3点です。
- プロフィール情報のカスタマイズが自由にできるようになりました
- ブログや掲示板への画像や添付ファイルの張り付けが簡単になりました
- OpenIDのRPとしての動作に加え、OPとしても動作するようになりました
ほかにも多くの改善が行われており、セキュリティ対応も行っていますので、もしご利用中の方がいたら、ぜひアップデートしてください。
関連リンク: | |
SKIPバージョン1.1リリースノート http://portal.openskip.org/top/releasenote-ver1-1-0 |
今回のバージョンアップで、本連載に関係する部分はOpenIDへの対応という点です。すでにSKIPでは、以前のバージョンからRPとしての動作はできるようになっていましたが、バージョン1.1からはOPとしての動作もできるようになりました。
これにより、SKIPはOpenIDのOPにもRPにもなることができるようになりました。今回の記事では、RPとして動作するパターンと、OPとして動作するパターンのコードリーディングを行います。
本記事ではバージョン1.1のソースコードを扱います。入手方法は、第3回にありますので、参考にしてください。
関連リンク: | |
SKIP公式ページのアーカイブ(zipで入手) http://www.openskip.org/ja/download/ |
|
SKIP ver.1.1.0のソースコード(GitHub) http://github.com/openskip/skip/tree/v1.1.0 |
1/3 |
Index | |
OpenIDを実装したソースコードを読もう | |
Page1 OpenIDでWebの認証を便利に実現 OpenIDについて SKIPバージョン1.1リリースしました! |
|
Page2 RPとして動作するSKIPのコードを読む SKIPにおけるRPの活用シーンと独自の拡張 |
|
Page3 OPとして動作するSKIPのコードを読む |
Railsコードリーディング 〜scaffoldのその先へ〜 |
Ruby/Rails関連記事 |
プログラミングは人生だ まつもと ゆきひろのコーディング天国 ときにプログラミングはスポーツであり、ときにプログラミングは創造である。楽しいプログラミングは人生をより実りあるものにしてくれる |
|
生産性を向上させるRuby向け統合開発環境カタログ Ruby on Rails 2.0も強力サポート 生産性が高いと評判のプログラミング言語「Ruby」。統合開発環境を整えることで、さらに効率的なプログラミングが可能になる |
|
かんたんAjax開発をするためのRailsの基礎知識 Ruby on RailsのRJSでかんたんAjax開発(前編) 実はAjaxアプリケーション開発はあなたが思うよりも簡単です。まずはRuby on Railsの基礎知識から学びましょう |
|
Praggerとnetpbmで作る画像→AA変換ツール Rubyを使って何か面白いものを作ってみよう! 一般的な画像をアスキーアートに変換するツールを作ってみる。さらに出力にバリエーションを持たせてみよう |
|
コードリーディングを始めよう Railsコードリーディング〜scaffoldのその先へ〜(1) 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|