Railsでomniauthを使ってtwitter,facebookの簡単ログイン認証

ruby on rails では簡単にtwitterやfacebookと認証ができるライブラリがあります。
それがomniauthです。

Twitterdeveloperに登録する

Twitter Developer
上記から入って登録していきます。
今回必要なのは赤枠でくくっている。

・Consumer key
・Consumer secret
・Callback URL※戻り先のURL

Facebookdeveloperに登録する

Facebook Developer
上記から入って登録していきます。

ここで必要なのは赤枠の部分です。
・App ID
・App Secret

Gemのインストール

gemでomniauthをインストールします。

gem 'omniauth'

後は、ライブラリをインストールします。

bundle install

nokogiriのinstallエラー

libxml2が無いとインストールができません。
CentOS,RedHot:OS別のインストール方法

yum install -y libxml2 libxml2-devel libxslt libxslt-devel
gem install nokogiri

omniauthを組み込む

Railsに組み込むためにconfig/initializersの中に下記のようなファイルを作ります。
config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter,"Consumer key","Consumer secret"
 provider :facebook,"App ID","App Secret"
end

ルーティング

ルーティングがなるようにroutes.rbを設定します。
config/routes.rb

match "/auth/:provider/callback" => "sessions#callback"
match "/logout" => "sessions#destroy", :as => :logout

ユーザーテーブル作成

omniauthのユーザー用のテーブルを用意します。

$rails generate model omniuser provider:string uid:string 
name:string screen_name:string

マイグレーションを実行しておきます。

rake db:migrate

モデル部分の設定

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.name = auth["user_info"]["name"] 
      user.screen_name = auth["user_info"]["nickname"]
    end  
  end  
end  

self.を使ってcreate_with_omniauthというクラスメソッドを使って新規ユーザーを追加しています。

認証とログアウト

認証とログアウトのためのコントローラーを設定します。
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_url, :notice => "login&quot
end
def destroy
    session[:user_id] = nil
    redirect_to root_url, :notice => "Logged out"
  end
end

ログインを分ける

ログインしているユーザーとしていないユーザーがわかるように設定します。
app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery
  private
  def current_user
    @current_user ||= User.find(session[:user_id])
    end
  end
  helper_method :current_user
end

viewの設定

最後にホームページのデザインの部分の設定です。
全体で認証を行う場合で設定しています。
app/views/layouts/application.html.erb

<div id="user_nav">
<% if current_user %>
<%= current_user.name %>さん <%= link_to "ログアウト" ,logout_path %>
<% else %>
<%= link_to "Twitterでlogin","/auth/twitter" %>
<%= link_to "facebookでlogin", "/auth/facebook" %>
<% end %>
</div>

current_userでログインしているかしていないで判別して表示を切り替えています。
同じようにほかの部分でもログインしているかしていないかで表示を切り替えることができます。
これで完成です。


コメント

分りません。

2012年11月30日7:39 PM | 田嶋 豊

app/controllers/application_controller.rbですが、
@current_user ||= User.find(session[:user_id]) if session[:user_id]
とif文をかまさないと
Couldn’t find User without an ID
になりませんか?

あと、SessionsControllerのcallbackアクションのrequestって来てますか?
undefined method `[]’ for nil:NilClass

2013年3月21日12:00 AM | shinriyo

コメントする