#はじめに
Faraday Middlewareのoauthやoauth2についての記事が少なかったので,ソースコードを読んで分かったことを備忘録として残しておく.
#環境
macOS Sierra (10.12.1)
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16]
faraday (0.10.0)
faraday_middleware (0.10.1)
#Faradayについて
まずFaradayについて.
gem install faraday
でインストールできる.HTTPクライアントの一つ.Rubyで単にGETやPOSTしたかったら標準ライブラリのNet::HTTPを使えばよいが,少し複雑になるとFaradayのほうがスッキリと書ける.また,Faraday Middlewareを使うことで,json形式のレスポンスのパースやOAuth認証,URLエンコードなどが楽にできるようになる.
以下,Faraday Middlewareを使わない場合の,基本的な使い方.
conn = Faraday.new(:url => 'https://hoge') do |faraday|
faraday.request :url_encoded
faraday.adapter Faraday.default_adapter
end
#https://hoge/fugaにGETリクエストを送る
conn.get('/fuga')
#?foo1=bar1&foo2=bar2というクエリパラメータを付けて送る
#方法1
conn.get('/fuga', { :foo1 => bar1, :foo2 => bar2 } )
#方法2
conn.get do |req|
req.url '/fuga'
req.params[foo1] = bar1
req.params[foo2] = bar2
end
get
やpost
のブロックにreq.headers['foo'] = bar
やreq.body = %({ "foo": "bar" })
などとすればヘッダやボディも記述できる.
Faraday Middlewareを使う場合,Faraday.new
のブロック内に明記する.例えば,
Faraday.new(:url => 'https://hoge') do |faraday|
faraday.request :oauth, options
faraday.request :url_encoded
faraday.response :json
faraday.adapter Faraday.default_adapter
end
とする.request,response,adapterの順番.requestは重要な順,responseは重要でない順に並べる.default adapterはNet::HTTP.
インストールはgem install faraday_middleware
でできる.
#FaradayMiddleware::OAuthについて
Faradayで簡単にOAuth1認証を行うためのmiddleware.
faraday.request :oauth, options
とする.この中身はSimple OAuthを用いた単純なものだが,optionsを指定するだけでよいので楽である.
optionsには:consumer_key
,:consumer_secret
,:token
,:token_secret
をHashで与える.このHashがそのままSimpleOAuth::Header#newへ渡され,アクセストークンや署名などを必要な形式に整えてリクエストのAuthorizationヘッダへ返す.Authorizationヘッダがすでに設定されているときは上書きされない.
#FaradayMiddleware::OAuth2について
Faradayで簡単にOAuth2認証を行うためのmiddleware.
faraday.request :oauth2, token, options
とする.tokenはString,optionsはHashで指定する.tokenにはアクセストークンを与える.省略可(省略したら,リクエストする際に手動で指定する).デフォルトはnil.optionsも省略可.
リクエストごとに,クエリパラメータのaccess_tokenとAuthorizationヘッダの両方にtokenを加える.すでに値が存在する場合は上書きしない.
options[:param_name]
を指定したときは,クエリパラメータのaccess_tokenがその値(に#to_s
したもの)に代わる(例: options[:param_name] = my_access_token
としたら?my_access_token=token
となる).options[:param_name]
が存在しないとき(デフォルト)はaccess_tokenである.
#まとめ
def connection
Faraday.new(:url => url) do |faraday|
faraday.request :oauth, options
faraday.request :url_encoded
faraday.adapter Faraday.default_adapter
end
end
のようにしておけば,手軽に認証ができる.TwitterであればRubyGemsを使ったほうが便利なのだが,汎用性は高いと思う.