kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

gem omniauth(-twitter)

最近kindleかpadが欲しいkikeda1104です。書籍が重いです。 今回は、deviseで認証機能を開発していましたが、やや多機能すぎたので、これをomniauthのgemに切り替えました。twitterのアカウントを利用したかったのでomniauth-twitterもGemfileに入れています。

gem omniauthの導入

Gemfileにgemを追加

$ cd rails_app
$ vim Gemfile
# Gemfile
...
gem 'omniauth'
gem 'omniauth-twitter'

bundle

$ bundle install

Twitter Application Managementにappを登録

Twitter Developersにアカウントを作成していただいてから、 Twitter Application Managementにアクセスします。

f:id:kikeda1104:20141023231230p:plain

「Create App new」ボタンを押します。

Applicationの情報を入力

f:id:kikeda1104:20141023231403p:plain

Name、description、WebSite、Callback URLを入力します。

こんな感じですね。

f:id:kikeda1104:20141023231535p:plain

Twitter Application ManagementでApplicationの作成が終わると、「Key and Access Token」というタブがあるので、クリックして「Consumer Key (API Key)」と「Consumer Secret (API Secret)」をコピーしておく。 (開いておいてください)

config/initializeに追加

$ vim config/initialize/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do                                                                                 
  provider :twitter, "api_key", "access_token" # ここに先ほどコピーしたもしくは開いておいたKeyとAccess Tokenを入力します。                                                                                                
end 

コーディング

helperを追加

application_controller.rb

  helper_method :logged_in?

  private 

  def logged_in?                                                                                                      
    !!session[:user_id]                                                                                                                      
  end

viewにコードを追加

application.html.hamlかheaderとなるhtmlに記述します。

...
%li                                                                                                                                          
  - if logged_in?                                                                                                                            
    = link_to 'ログアウト', logout_path                                                                                                      
  - else                                                                                                                                     
    = link_to 'twitterログイン', '/auth/twitter'

controller追加

sessions_controller.rbを作成します。

$ rails g controller sessions
$ vi app/controller/sessions_controller.rb
class SessionsController < ApplicationController                                                                                             
  def create                                                                                                                                 
    user = User.create_from_auth_hash(request.env['omniauth.auth'])                                                                          
    session[:user_id] = user.id                                                                                                              
    redirect_to root_path, notice: 'ログインしました'                                                                                        
  end                                                                                                                                        
                                                                                                                                             
  def destroy                                                                                                                                
    reset_session                                                                                                                            
    redirect_to root_path, notice: 'ログアウトしました'                                                                                      
  end                                                                                                                                        
end

route追加

ルーティングを追加します。

get '/auth/:provider/callback' => 'sessions#create'                                                                                          
get '/logout' => 'sessions#destroy', as: :logout

参考書籍:

以上です。