ブログ  前の記事  次の記事  2007-09-24 

たけまる / OAuth - リソースへのアクセスを代行するプロトコル


2007-09-24

_ OAuth - リソースへのアクセスを代行するプロトコル [oauth][openid]

[2007-09-23-1] で AtomPub の認証について書いたからというわけではな
いのですが,OAuth というプロトコルの仕様を斜め読みしたのでメモして
おきます.間違いがあったら教えていただけると嬉しいです m(_ _)m

(追記) OAuth の「背景」みたいのについては,miyagawa さんからもらっ
たコメントと,まちゅさんのエントリが参考になります.
- miyagawa さん
oAuthはFlickr,GoogleAuthSub,Y!BBAuth,AOL openAuth,TypeKeyなんかの
統合プロトコルという位置づけ。例では401->WWW-Authenitcateが
handshake になってるけど実際はもっと他の方法で運用されるんじゃない
かなぁ
- まちゅさん
WebAPI のアクセス制御に使える OAuth という仕様 - まちゅダイアリー (2007-09-25)

さて,OAuth は,第三者に対して,認証を要求するリソースへのアクセス
を一時的に許可するためのプロトコルです.

たとえば,写真印刷サービスがあるとします.そして,あなたは flickr
に保存してある非公開写真の印刷を依頼しようとしています.このとき,
写真を "公開" 状態にすることなく,また flickr へのログイン情報を教
えることもなく,印刷を依頼することができます.

OpenID が "authentication (認証) の分散" だとすると,OAuth は
authorization (許可) になります.

(参考) 仕様から学ぶOpenIDのキホン − @IT

処理フローは OpenID とほぼ同じようです.OpenID の拡張にしてもよさ
そうに思いましたが,OpenID 以外の認証方法と組み合わせるために独立
したプロトコルにしたのでしょう.

いくつか気になった点がありました.

現在の仕様では,アクセスを許可するリソースを限定できないように思い
ました.つまり,写真印刷サービスは,印刷する写真だけでなくすべての
写真にアクセスできてしまいそうです.最終的には修正されると思います
が (詳しくは後述).

さらに,HTTP メソッドを限定できるとよさそうです.GET は許可するけ
ど,PUT, DELETE は不許可という状況はありそうなので.

簡単なメモを残しておきますので,よかったら参考にしてください.詳し
い説明は ZIGOROu さんあたりがしてくれそうな気がするので,待つこと
にしましょう ;-)

■ 用語

End User リソース所有者.Consumer にリソースを提供.
Protected Resource End User が Consumer に公開するリソース.
Consumer リソース処理者.(例: 写真印刷サービス)
Service Provider リソース管理者.(例: flickr)

■ 処理フロー

簡単に説明するとこんな感じです.

- Consumer はリソースへのアクセスに失敗 (401) すると,Service
  Provider に Request Token を要求します
- 次に,End User は Service Provider へとリダイレクトされ,リソー
  ス公開の可否を問われます
- OK であれば,Service Provider は Consumer に Access Token を渡し
  ます
- Consumer はこの Access Token が期限切れになるまで,リソースにア
  クセスすることができます

大雑把なフローチャートを載せておきます.



図では詳細なパラメータは省略してあります.たとえば,Consumer は自
分の ID としてoauth_consumer_key を付与します.

oauth_token などのパラメータは,URL クエリパラメータあるいは HTTP
Body に含めて送信します.必要に応じて署名がされます.

■ 仕様に対する小さな疑問: 公開されるリソースの範囲について

この仕様では,Consumer がどのリソースにアクセスしようとしているの
かについて,Service Provider は明確に知ることができません.直前に
401 を返したリソースと判断することもできますが,不確実だと思います.
この結果,Service Provider は,その End User に関するすべてのリソー
スを公開することになります.これは受け入れられにくいでしょう.

おそらく仕様が追加されて,Consumer が Request Token を要求するとき
に,Protected Resource のURL を指定するようになるんじゃないでしょ
うか.

なお,Access Token についての説明で,"アクセスを特定のリソースに限
定しても良い" との記述はありますが,その方法は書かれていません.
Access Tokens MAY limit access to certain Protected Resources

■ 実装

PHP, Ruby, Python, Java, .NET の実装は進んでいるようですが,Perl
や JavaScript の実装はないようです.

一言メッセージをこっそり送信できます (非公開)
 今年の西暦→
Referrer (Inside): [2007-11-26-1]