読者です 読者をやめる 読者になる 読者になる

OmniAuth 1.0.0をRails 3.1に組み込む方法

OmniAuth Rails

OmniAuthが1.0.0になり、使い方が少し変更されていたのでメモ。OmniAuth 1.0.0を使ってTwitterのアカウントで認証する方法です。

omniauth.rbの作成

  • config/initializers/omniauth.rb
    • 'Consumer Key'と'Consumer Secret'には、Twitterから発行されたキーを入力します。
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, 'Consumer Key', 'Consumer Secret'
end

Strategyのインストール

認証のパーツがStrategyという単位で分割されています。Strageryのリストは以下のURLから確認できます。

TwitterのStrategyをインストールします。

$ sudo gem install omniauth-twitter

Gemfileに追加してインストールします。

gem 'omniauth'
gem 'omniauth-twitter'
$ bundle install

Userモデルの作成

$ rails g model user provider:string uid:string screen_name:string name:string
$ rake db:migrate
  • app/models/user.rb
    • 以前のバージョンではrequest.env['omniauth.auth']['user_info']に格納されていたユーザ情報が、request.env['omniauth.auth']['info']に格納されるようになりました。
class User < ActiveRecord::Base
  def self.create_with_omniauth(auth)
    create! do |user|
      user.provider = auth['provider']
      user.uid = auth['uid']
      user.screen_name = auth['info']['nickname']
      user.name = auth['info']['name']
    end
  end
end

Sessionsコントローラの作成

$ rails g controller sessions
  • app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
  def callback
    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_path
  end
  
  def destroy
    session[:user_id] = nil
    redirect_to root_path
  end
end

Applicationコントローラの編集

  • app/contorllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery

  def login_required
    if session[:user_id]
      @current_user = User.find(session[:user_id])
    else
      redirect_to root_path
    end

  end

  helper_method :current_user

  private
  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
end

routes.rbの編集

  • config/routes.rb
match '/auth/:provider/callback', :to => 'sessions#callback'
match '/logout' => 'sessions#destroy', :as => :logout

ログインリンクを表示

  • app/views/layouts/application.html.erb
<% if current_user %>
  <%= current_user.name %> <%= link_to 'ログアウト', logout_path %>
<% else %>
  <%= link_to 'ログイン', '/auth/twitter' %>
<% end %>

参考:Action*3 - OmniAuthの1.0に対応