Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

はじめに

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

Naughie
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした