2011年8月11日木曜日

omniauthによるtwitter認証を試してみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
●追記 日付:2012/2/6
http://yorunocafe.blogspot.com/2012/02/rails-omniauth.html

以下のやり方はちょっと古いみたいです。

railscastに乗ってる認証を参考にしながらデモページを作ってみた。

デモページ:SimpleOmniAuthのデモ
※削除しました。

・下準備
rails g nifty:scaffold post name:string index new edit #post用(適当)
rails g controller sessions #認証をセッションで管理
rails g model user provider:string uid:string name:string #認証データ保存用
rake db:migrate


①gemfileに定義
gem "omniauth"

②config/initializer にomniauth.rbファイル作成し、twitter/appのコンシューマーキーとシークレットキーを設定。(あらかじめ取得しておく)

Rails.application.config.middleware.use OmniAuth::Builder do  
  provider :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET'  
end

③サインアウトとサインインのリンクを表示したいビューに定義。
<div id="user_nav">  
  <% if current_user %>  
    Welcome, <%= current_user.name %>!  
    <%= link_to "Sign Out", signout_path %>  
  <% else %>  
    <%= link_to "Sign in with Twitter", "/auth/twitter" %>  
  <% end %>  
</div>  

auth/twitterで内部でなんか認証ページに飛んでくれるらしい。
その戻しとしてsessions_contorllerのcreateを呼び出すようにrouteファイルに記述

④ルートの設定 sessions_controllerのcreateとdestoryを呼び出す感じ

 root :to => "articles#index"  #これはarticleのページ用
 match "/auth/:provider/callback" => "sessions#create" #認証後のコールバック
 match '/auth/failure' => 'simpleomniauthsessions#failure' #認証失敗時
 match "/signout" => "sessions#destroy", :as => :signout #サインアウト


⑤usersモデルに認証データのを保存するメソッドを記述しておく。

def self.create_with_omniauth(auth)
  create! do |user|
    user.provider = auth["provider"]
    user.uid = auth["uid"]
    user.name = auth["user_info"]["name"]
  end
end

⑥sessions_controllerのcreateで認証データを取得してuserデータに入れて保存する。
そこからユーザーデータを取得して、保存する。(パスワードは保存されないようだ)
idはセッションで管理。サインアウト時のdestoryと認証失敗時のfailureも記述しておく。

def create
    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 => "Signed in!"
 end
  
 def destroy
    session[:user_id] = nil
    redirect_to root_url, :notice => "Signed out!"
 end

 def failure
    redirect_to simpleomnisuthposts_url, :notice => "failure of authentication"
 end


ここまでで一応認証はできるみたいだ。
ページを指定してフィルターをかける場合は以下のようなヘルパーメソッドを用意して
セッションにuser.idを確認する。

helper_method :current_user

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


フィルタをかけたいコントローラーに以下のような感じで記述。
current_userがなければindexにリダイレクトさせる

before_filter :authenticate, :except => [:index, :show]

  # login check
def authenticate
    redirect_to :index unless current_user
end

次はgoogle、yahooのアカウントでの認証をテストしてみたい。
openIDを使うのかな?

0 件のコメント:

コメントを投稿