ゼロから学ぶOAuth

第4回 OAuth Service Providerの実装

この記事を読むのに必要な時間:およそ 3 分

OAuth Pluginの改善点

残念ながら,現状ではOAuth Pluginはまだ実用に堪えられるレベルには到達していません。OAuth Service Providerを実装するには,最低限以下の機能は追加する必要があるでしょう。

  • OAuth Consumerの削除(および編集)
  • OAuth Token一覧ページとOAutht Consumer一覧ページの分離

またデフォルトではTokenの有効期限やscopeはサポートされていないため,これらを扱いたい場合にはその部分も独自に実装する必要があります。

(補足)OAuth Signature

Service Providerでは,これらすべてのリクエストにおいてConsumerおよびTokenを認証するため,Signatureの検証を行います。Signatureを検証するために,Service ProviderはまずリクエストURLおよびリクエストに含まれるパラメータを正規化したSignature Base Stringを生成します。Signature Base Stringは以下の手順で生成されます。

参考:OAuth Core 1.0 - Signing Requests

  1. リクエストパラメータを集める。
    HTTP Authorization headerに含まれるパラメータを集める ⁠realmを除く⁠⁠。
    HTTP POSTリクエストに含まれるパラメータを集める。
    HTTP GETリクエストに含まれるパラメータを集める。

  2. 集めたパラメータからoauth_signatureを取り除く。

  3. パラメータをkeyの辞書順にソートする。同じkeyが複数含まれる場合は,それらをvalueの辞書順でソートする。

  4. ⁠key1=value1&key2=value2⁠のようにパラメータを連結する。valueが空の場合は"key="とする。

  5. リクエストURLを取得する。fragmentとqueryおよびデフォルトPort(80 for http,443 for https)は取り除き,schemeとdomainは小文字にすること。

  6. HTTP method(大文字,HEAD or GET or POST)とリクエストURL,および正規化されたパラメータをそれぞれURLエンコード(UTF-8)した後⁠&⁠で連結する。

Signature Base String生成後は,oauth_signature_methodパラメータで指定された方式でSignatureを生成し,Consumer側で生成されたoauth_signature(リクエストパラメータに含まれる)と一致するかどうか検証します。今回実装したOAuth Service Providerでは,ClientApplication.verify_request内でSignature Base Stringが生成&検証されています。

なおSignature Base StringにはリクエストURLが含まれるので,Service Provider側でproxyなどの影響でリクエストURLが変更される場合などは注意してください。

最後に

この連載では,OAuth ConsumerおよびOAuth Service Providerの実装を通じてOAuthを紹介してきました。今後OAuth ConsumerおよびService Providerを実装されるエンジニアの方に,何か1つでも参考になる情報があれば幸いです。

また先日TwitterのOAuthもpublic betaとして(ようやく)公開されました。smart.fmをはじめ,いままでTwitterユーザ名&パスワードの入力を求めていたサービスは,この機会にぜひTwitter OAuthを導入されることをお勧めします第2回第3回であつかったOAuth Consumer SampleにもTwitter対応を追加しておきました⁠⁠。

最後に,smart.fmおよびsmart.fm APIもよろしくお願いします(笑)

著者プロフィール

真武信和(またけのぶかず)

Cerego Japan Inc.で働くWebエンジニア。

smart.fmで外部APIとの連携機能(OAuth Consumer)の開発に携わるほか、smart.fm API(OAuth Service Provider)の開発にも携わっている。

URL:
http://matake.jp/
http://smart.fm/users/matake