OAuthを知る

どうやらOAuthというモノがあるらしい. 仕組みを考えだしたのはTwitterの中の人だとか.

そのOAuthについて理解を深めるために, 粛々とつづってみる. 間違っていたら突っ込んでいただけると嬉しいです.

OAuthの目的

OAuthは認証と認可を目的とする. OpenIDは認証だけなので, そこがOAuthとの違い.

この認可とは, 特定のコンシューマが, 認証されたユーザーの同意によって, サービスプロバイダ上にあるリソースへアクセスできるようになる, というモノ.

OAuthの登場人物

サービスプロバイダさん

ユーザーの認証と, リソースへ対するコンシューマからのアクセスを認可するサービスのコト. OpenIDでいうOpenID Providerの立場.

くだけて言うとOAuthサーバーみたいな感じ. 例えばTwitterとか.

コンシューマさん

リソースへのアクセスを, ユーザーの同意の上で行うサービスのコト. サービスと書いたが, 別にデスクトップアプリでもいい. OpenIDでいうRelying Partyの立場.

くだけて言うとOAuthクライアントみたいな感じ. 例えばTwitter用のデスクトップで動作するクライアントとか.

ユーザーさん

コンシューマから「ちょっとサービスプロバイダ上のリソースにアクセスしたいので, 許可してもらえるかな?」と言われる人.

OAuthの仕組み

リソースへのアクセスは認可もそうだが, まず認証されていなければならないので, たいていIDとパスワードが必要となる. そこをOAuthはトークンと言うランダムな文字列で代用するようにして, リソースへのアクセスを認めている, って感じ. このトークンは2種類ある.

認証トーク

まず「このURLにアクセスして, リソースにアクセスするのを許可してもらえるかな?」という時に必要となる認証トークン(request token). これは簡単に取得できる.

ちなみにこのタイミングでサービスプロバイダ側がログイン画面を用意するので, そこでユーザーにIDなりパスワードなりを入力してもらって, 認証を行う. 実際試してみるまでどこで認証がされるかがわかりづらかった……

そしてリソースへのアクセスの許可/拒否もしてもらう. 認証トークンの出番はこれだけ.

アクセストーク

次にリソースへのアクセスに必要となるアクセストークン(access token). この認証トークンとアクセストークンはユーザーの認証が済んで, さらに許可してもらった後なら取得できる(イメージ的には認証トークンと交換するイメージ).

そしてこのアクセストークンは何度でも使う. リソースへのアクセスに認可を下すには, アクセストークンが妥当かどうかで判断している. よって一度認可をもらえばリソースへのアクセスはツーツーというわけではなく, アクセストークンを毎回含め, 毎回認可してもらう必要がある.

OAuthを使うための準備

まずサービスプロバイダに「こういうコンシューマを作るので, お願いします」という登録が必要. それでコンシューマのキーと秘密の文字列を貰う. 秘密の文字列は署名(Signature)を生成するのに必要で, キー自体は認証トークンをもらうときも, アクセストークンを貰うときも, それ以後のアクセスを行うときも……, すなわちすべてのリクエストに含めなきゃいけない. でないと, どのコンシューマからのアクセスかわからないから.

というわけで, Twitterでコンシューマを登録してみる. まずhttp://twitter.com/oauth_clientsにアクセス.

"Register a new application »"のリンクをクリックして, コンシューマの情報を入力する.

特に重要なのがCallback URL. ユーザーの認証が済んだ後, ここに記入したURLにリダイレクトされるようになっている. なので大体はアクセストークンの取得を行うURLを書くコトになると思う.

そして登録したコンシューマの情報が記載されているページ.

Consumer keyがコンシューマのキー. Consumer secretが秘密の文字列となる. あと認証トークンとアクセストークンを取得するさいに用いるURL(Request token URL, Access token URL)と, ユーザーの認証およびリソースへのアクセス許可をしてもらうためのURL(Authorize URL)も書かれている.

これらの情報でサービスプロバイダとやりとりできる. ひとまずコンシューマの登録は完了したので, 準備はコレでおしまい.

次からコードを書いて実践してみる.

Rubyで実践 OAuth in Twitter