ゼロから学ぶOAuth
第3回 OAuth Consumerの実装(応用 : smart.fm APIおよびGoogle Data APIsの利用)
今回は,OAuth Consumerの実装の応用として,smart.fm APIとGoogle Data APIsの利用について解説します。
ruby-oauth の使い方
今後RubyでOAuth ConsumerおよびOAuth Service Providerを実装する場合は,ruby-oauthを利用することになるでしょう。第2回でruby-oauthのインストールは終わっているはずですが,まだインストールしていない人は以下を実行してください。
gem install oauth
Ruby OAuth GEMのサイトにも利用方法が紹介されていますが,実際には各Service Providerが要求するパラメータがあったりするため,この通りには使えません。またサイトではversion 0.2.7となっていますが,実際の最新は0.3.1ですので最新版を利用した方が良いでしょう。
そこで今回はこのruby-oauthの実際の使い方を学びながら,smart.fm APIおよびGoogle Data APIsのうちGoogle Contacts Data APIを利用してみましょう。OAuthでConsumerとService Providerが直接通信するシチュエーションは以下の3つです。
- 未認可のRequest Tokenを取得する
- 認可済のRequest TokenをAccess Tokenと交換する
- Access Tokenを利用した認可を必要とするデータへアクセスする
またそれ以外にブラウザのリダイレクトを利用する通信を行うシチュエーションが2つあります。
- 未認可のRequest Tokenに対してユーザの認可を求める
- 認可済のRequest TokenをConsumerに渡す
基本的には,この5種類の通信を扱えればOAuthを利用できます。
- 注)
- Yahoo! OAuthなど,一部のService ProviderではAccess Tokenの有効期限の延長が必要な例などもありますが,ここではそういった例は扱いません。
そして,この5種類の通信を扱う為に必要なruby-oauthのクラスは,OAuth::Consumer/OAuth::RequestToken,OAuth::AccessTokenの3つのみです。よってこの3つの利用方法を覚えれば,OAuth Consumerの実装が可能になります。
OAuth::Consumerの利用
未認可のRequest Tokenを取得するには,OAuth::Consumer#get_request_tokenを利用します。またOAuth::RequestToken,OAuth::AccessTokenのインスタンスを作成する際にも,OAuth::Consumerインスタンスが必要です。そこでまずはOAuth::Consumerのインスタンスを作成しましょう。
@consumer = OAuth::Consumer.new(
CONSUMER_KEY,
CONSUMER_SECRET,
options
)
ここでoptionsには以下のようなパラメータが指定可能です。
options = {
:site => SERVICE_PROVIDER_URL,
:request_token_url => SERVICE_PROVIDER_REQUEST_TOKEN_URL,
:request_token_path => SERVICE_PROVIDER_REQUEST_TOKEN_PATH,
:authorize_url => SERVICE_PROVIDER_AUTHORIZE_URL,
:authorize_path => SERVICE_PROVIDER_AUTHORIZE_PATH,
:access_token_url => SERVICE_PROVIDER_ACCESS_TOKEN_URL,
:access_token_path => SERVICE_PROVIDER_ACCESS_TOKEN_PATH,
:scheme => (:header || :body || :query_string),
:http_method => (:post || :get),
:signature_method => ('HMAC-SHA1' || 'RSA-SHA1' || 'PLAINTEXT'),
:private_key_file => PATH_TO_PRIVATE_KEY,
:oauth_version => "1.0"
}
siteは必須,oauth_versionは指定不可(1.0で固定)です。それ以外のパラメータは以下のように利用されます。
request_token_(url|path),authorize_(url|path),
access_token_(url|path)
xxx_urlはxxx_pathよりも優先されます。xxx_pathのみを指定した場合はsiteの値が用いられます。
xxx_url = site + xxx_path
何も指定しない場合はそれぞれ以下のデフォルト値が利用されます。
:request_token_path => '/oauth/request_token'
:authorize_path => '/oauth/authorize'
:access_token_path => '/oauth/access_token'
signature_method,private_key_file
Service Providerごとにサポートされているsignature_methodは異なりますが,通常はHMAC-SHA1を利用すれば良いでしょう。ruby-oauthでもHMAC-SHA1がデフォルト値になっていますので,特に指定することはありません。signature_methodにRSA-SHA1を利用する場合は,private_key_fileに秘密鍵のパスを指定します。またhttps通信が利用できない場合はPLAINTEXTは避けましょう。
scheme,http_method
OAuthでは通常はAuthorizationヘッダを利用して通信を行いますが,それ以外にもPOSTアクセスではRequest Body,GETアクセスではquery_stringを利用することもできます。ruby-oauthのデフォルトは以下のようになっています。
:scheme => :header
:http_method => :post
こちらもService Provider側から特に指定の無い限り,ruby-oauthのデフォルト値で問題ありません。
ゼロから学ぶOAuth
- 第4回 OAuth Service Providerの実装
- 第3回 OAuth Consumerの実装(応用 : smart.fm APIおよびGoogle Data APIsの利用)
- 第2回 OAuth Consumerの実装(入門 : OAuth Access Tokenの取得と利用)
- 第1回 OAuthとは?―OAuthの概念とOAuthでできること


