その他
    ホーム 技術発信 DoRuby rubyでOAuthを使ってみる

    rubyでOAuthを使ってみる

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    Google, twitter, mixiアプリなどのAPI認可のためのOAuth(オース)という

    プロトコルが利用されています。

    今回は、マッシュアップなWebサービスを作る上で必要になってくるOAuthの簡単な概念とrubyでの使用例を紹介したいと思います。

     OAuthとは?

    デスクトップアプリやwebアプリケーションなどにセキュアなAPI認証の

    標準的な手段を提供するオープンプロトコルです。

    OAuth利用することによって、ユーザのgoogleアカウント情報(ID,Password)を保持しなくてもgoogleのアドレス帳などを参照するwebサービスを作ることができます。

     OAuthが必要になった背景

    OAuthがなかった場合、先程の例のようなgoogleのアドレス帳を参照するサービスを作ろうとした場合、ユーザのgoogleアカウント情報をもとにアクセスすることになります。しかし、googleのアカウントはGmailやgoogleチェックアウトなど様々なサービスに紐づいており、迂闊にこのようなアクセスをすると万一の時のリスクが高くなります。

    そもそもこの例では、googleのアドレス帳にさえアクセスできれば十分で、このように限られたリーソスへのアクセスを認証するため、APIへのアクセスを認可する手段が必要となりました。

     OAuthでのAPI認証の流れ

    OAuthではトークンのやりとりによって、APIのアクセスの認可を行います。

    OAuthではいかの登場人物が登場します。

    • OAuth Service Provider…APIを提供する側(例:twitter, google)
    • OAuth Service Consumer…APIを利用する側(例:twitterクライアント, google API群を利用したサービス)
    • User…ConsumerがProviderが提供するAPIを利用してProviderのサービスにアクセスすることを許可する人(例:twiiterクライアントを使おうとしている人)

    それでは、OAuthによるAPIの認証の流れを説明します。

    1) ConsumerはProviderにアプリケーションの登録を行い、Consumer KeyとConsumer Secretを取得する。

    2) Consumer KeyとConsumer Secretをもとにrequestトークンを取得する

    3) 取得したrequestトークンをもとに、ユーザがAPI認可するためのURLを生成する

    4) ユーザは生成されたAPI認可のページアクセスし、ConsumerがAPIを利用してProvierにアクセスすること許可(または拒否)する

    5) (以下許可されたと仮定)認可されたrequestトークンを元に、access token, access secretを取得する

    6) access token, access secrete, consumer keyを元にAPIにアクセスする。

    大まかにこんな流れでAPIの認証が行われます。改めてここで重要なのは「ConsumerにはユーザのProviderのアカウント情報がわたっていないことです」

    大まかな流れが理解できたところで、実際にOAuthを使ってみたいと思います。今回は題名の通り ruby を使って twitter でのOAuthを試してみたいと思います。

     準備

    あらかじめ、twitterのアプリ登録とoauthライブラリをインストールしておきます。rubyのoauthライブラリはgemでインストールできます。

    gem install oauth
    

    また、twitterのアクセスの簡単化のため twitterのライブラリもインストールしておきます

    gem install twitter
    

     実際にやってみる

    今回は、OAuthの流れをつかみやすくするためirbで試してみました。

    require 'rubygems'
    require 'oauth'
    
    CONSUMER_KEY = "your-key"
    CONSUMER_SECRET = "your-secret" 
    
    consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, :site => "http://twitter.com")
    
    request_token = consumer.get_request_token 
    # twitterに対してrequestトークンを要求
    
    request_token.authorize_url # requrest tokenをもとに認証URLを生成
    
    

    ここで表示されたURLにアクセスし、このrequest tokenを有効にしてください。

    irbは止めずにこのままにしてください。

    oauth_verifier = "000000" 
    # 許可後した後に表示された数字を入力してください
    
    access_token = request_token.get_access_token(:oauth_verifier => oauth_verifier )
    # 有効化されたrequest_tokenをもとにaccess token, access secretを取得
    
    access_token = access_token.token
    access_secret = access_token.secret
    
    # access_key, access_secret, consumer_key, consumer_secretをもとにAPIにアクセスする
    oauth = Twitter::OAuth.new(CONSUMER_KEY, CONSUMER_SECRET)
    oauth.authorize_from_access(access_token, access_secret)
    twitter_client = Twitter::Base.new(oauth)
    
    # 投稿してみる
    twitter_client.update("hogehoge")
    
    

    ここで、実際に書き込まれたかtwitterに書き込まれたことを確認しましょう。無事書き込まれていたら、OAuthによるAPI認証成功です。