LoginSignup
6
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-04

はじめに

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を使ったほうが便利なのだが,汎用性は高いと思う.

6
5
0

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
  3. You can use dark theme
What you can do with signing up
6
5