RailsでOmniauthを使ってTwitterログインする


Ruby2.0, Rails4で確認

いつか試そういつか試そうと思っていたOmniauthを使ってのTwitterログインを試してみました。

初期設定

  • Twitterアプリの作成

callback URLに「http://127.0.0.1:3000/auth/twitter」を指定しておきます。

後々投稿もさせたいのでAccessを「Read and Write」にしてあります。

「Allow this application to use ‘Sign in with Twitter」にチェックを入れておくと、二度目のログイン以降は認証画面を省略することができます。

twitterlogin

  • Gemfile追加

consumer key等を設定ファイルで一括管理したいのでsettingslogicも追加しました。

gem 'omniauth'
gem 'omniauth-twitter'
gem 'settingslogic'
gem 'twitter'  # gem twitterは次回使います
  • bundle install
./bin bundle install
  • settingslogic initializer設定
# config/initializers/0_settings.rb

class Settings < Settingslogic
  source "#{Rails.root}/config/settings.yml"
  namespace Rails.env
end
  • settings.ymlにtwitter設定を記述

「:」の部分が全角になっていますが本来は半角「:」です。

(このブログでうまく表示ができなかったため全角にしています)

# config/settings.yml

defaults: &defaults

development:
  <<: *defaults
  twitter:
    consumer_key: YOUR CONSUMER KEY
    consumer_secret: YOUR CONSUMER SECRET

test:
  <<: *defaults

production:
  <<: *defaults
  • omniauth initializer設定
# config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, Settings.twitter.consumer_key, Settings.twitter.consumer_secret
end

model作成

  • userモデル作成
./bin/rails g model user provider:string uid:string screen_name:string name:string
  • migrate
./bin/rake db:migrate
  • app/models/user.rb
# app/models/user.rb

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

controller作成

  • controller作成
./bin/rails g controller base
./bin/rails g controller home index
./bin/rails g controller sessions
  • routing追加
# config/routes.rb
root 'home#index'
get "home/index"
get '/auth/:provider/callback', :to => 'sessions#callback'
post '/auth/:provider/callback', :to => 'sessions#callback'
get '/logout' => 'sessions#destroy', :as => :logout
  • BaseController
# app/controllers/base_controller.rb

class BaseController < 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
  • HomeController
# app/controllers/home_controller.rb

class HomeController < BaseController
  def index
  end
end
  • SessionController
# 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

View変更

  • layout追加
# app/views/layouts/application.html.erb

<% if current_user %>
  <%= current_user.name %> <%= link_to 'ログアウト', logout_path %>
<% else %>
  <%= link_to 'ログイン', '/auth/twitter' %>
<% end %>

ブラウザからhttp://127.0.0.1:3000
にアクセスするとログインリンクが表示され、Twitter認証ができるようになりました。

次回は

ログインしたアカウントでTweet投稿ができるようにしてみます。

参考