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」にチェックを入れておくと、二度目のログイン以降は認証画面を省略することができます。
- 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投稿ができるようにしてみます。