LoginSignup
5

More than 5 years have passed since last update.

posted at

updated at

Farraday MiddlewareによるOAuth認証について

はじめに

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

getpostのブロックにreq.headers['foo'] = barreq.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を使ったほうが便利なのだが,汎用性は高いと思う.

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5