d4i.log

作ったものなど

Ruby on Rails で Oauth を使う

 Ruby on Rails 4 で Oauth 認証するときにやったことの自分用メモ。

 主に RailsCasts を参考に OmniAuth による Twitter 認証を実装してみました。

f:id:d4i:20130909212839p:plain

手順


アプリの登録

 プロバイダ (今回は Twitter) に自分のアプリを登録しておきます。
 例えば、ローカルのマシンで開発してる場合は下記のように適当に。

Website: http://127.0.0.1:3000/
Callback URL: http://127.0.0.1:3000/auth/twitter/callback

 加え、 Consumer key と Consumer secret の値を控えておきます。

Rails アプリ作成
$ rails new demo
$ cd demo
$ rails g controller sessions
$ touch app/views/sessions/index.html.erb
$ rails g model user provider uid name
$ rake db:migrate
/Gemfile

 OmniAuth は Oauth 認証に、 Figaro は後述のキーの管理に使用します。

gem 'omniauth-twitter'
gem 'figaro'
bundler
$ bundle install
キーの管理

 Consumer key と Consumer secret は Git の外の YAML で管理します。

$ rails g figaro:install
/config/application.yml

 控えた Consumer key と Consumer secret を記述 (下記例は架空のもの) 。

TWITTER_KEY: 7381a978f7dd7f9a1117
TWITTER_SECRET: abdc3b896a0ffb85d373
/config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET']
end
/config/routes.rb
root 'sessions#index'

get '/auth/:provider/callback' => 'sessions#create'
delete '/signout' => 'sessions#destroy', as: :signout
/app/controllers/sessions_controller.rb
def create
  auth = request.env["omniauth.auth"]
  user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth)
  session[:user_id] = user.id
  redirect_to root_url, :notice => "Signed in!"
end

def destroy
  session[:user_id] = nil
  redirect_to root_url, :notice => "Signed out!"
end
/app/controllers/application_controller.rb
helper_method :current_user

private

def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
end
/app/models/user.rb
def self.create_with_omniauth(auth)
  create! do |user|
    user.provider = auth["provider"]
    user.uid = auth["uid"]
    user.name = auth["info"]["name"]
  end
end
/app/view/layouts/application.html.erb
<% if current_user %>
  Welcome <%= current_user.name %>!
  <%= link_to "Sign Out", signout_path %>
<% else %>
  <%= link_to "Sign in with Twitter", "/auth/twitter" %>
<% end %>

 これで完了です。

テスト


WEBrick 起動
$ rails s
ブラウザからアクセス

認証前

f:id:d4i:20130909214205p:plain

Twitter 認証

認証後

f:id:d4i:20130909214233p:plain

できた! (はず)

WEB+DB PRESS Vol.73

WEB+DB PRESS Vol.73

  • 作者: 設樂洋爾,白土慧,はまちや2,大和田純,松田明,後藤大輔,ひろせまさあき,小林篤,近藤宇智朗,まかまか般若波羅蜜,Mr. O,川添貴生,重国和宏,柳澤建太郎,奥野幹也,佐藤鉄平,後藤秀宣,mala,中島聡,堤智代,森田創,A-Listers,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2013/02/23
  • メディア: 大型本
  • 購入: 12人 クリック: 131回
  • この商品を含むブログ (4件) を見る