ゼロから学ぶOAuth

第3回 OAuth Consumerの実装(応用 : smart.fm APIおよびGoogle Data APIsの利用)

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

今回は,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のデフォルト値で問題ありません。

著者プロフィール

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

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

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

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

コメント

コメントの記入