Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@Naughie

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
6
Help us understand the problem. What are the problem?