読者です 読者をやめる 読者になる 読者になる

帰ってきたHolyGrailとHoryGrailの区別がつかない日記

はてなブログに帰って来ました

Ruby on Rails + devise & omniauth で サクっとTwitter連携

友達とのやりとりにちょっとしたツールが必要だったのでTwitterでサクっとログインしていろいろできるような実装をしていたのですが導入部分でちょいちょいコケたりしたので比較的新しいバージョンで動かせるサンプルを載せておきます。

なお、今回はほぼ

Twiwt:Blog / jugyo : Rails で Devise と OmniAuth を連携させる

を参考にすべてのコードを書きました。ありがとうございます。
こちらのエントリは上記記事の焼き直し記事になります。

今回使ったバージョン

Gemfileを編集

gem 'devise'
gem "omniauth-twitter"

今回はTwitter連携するため omniauth-twitter を追記しています
facebook と連携するには omniauth-facebook を書きましょう

$ bundle install

で gem install

deviseの設定

$ rails g devise:install

config/initializers/devise.rb

というファイルができるのでOmniAuthの設定を追記する

config.omniauth :twitter, 'ConsumerKey', 'ConsumerSecret'

User モデルの作成

$ rails g devise user

db/migrate/YYYYMMDDHHMMSS_devise_create_users.rb

というファイルができるのでこれを編集します

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      t.integer :uid
      t.string :name
      t.timestamps
    end

    add_index :users, :uid,    :unique => true
    add_index :users, :name, :unique => true

  end
end

デフォルトで

      t.string :email,              :null => false, :default => ""
      t.string :encrypted_password, :null => false, :default => ""

といったものがありますが今回はパスワードやメールアドレスを必要としなかったのですべて削除しました。

user.rbにdeviseがデフォルトでいろんなincludeされているためここを編集します

devise :omniauthable

attr_accessible :uid, :name

モデルを準備したらmigrateしましょう

$ bundle exec rake db:migrate

コールバック処理の作成

$ rails g controller users/omniauth_callbacks

app/controllers/users/omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def twitter
    uid = env["omniauth.auth"]["uid"]
    user = User.find_by_uid(uid) || User.create!(:uid => uid, :name => env["omniauth.auth"]["info"]["nickname"])
    sign_in_and_redirect user
  end
end

env["omniauth.auth"]["info"] に Twitterからいろいろな情報が帰ってきます
すでに作成されたuidがなければ新規ユーザが作成されsign_inの処理が行われます

routes.rb を下記のように書き換えます

  devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } do
    get '/users/sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session
  end

ログインリンクの作成

これで処理の部分はすべて完成です。
レイアウトファイルにログインリンクを用意しましょう。
今回の自分の場合 haml-rails (とtwitter-bootstrap-rails)を使って layout ファイルをジェネレートしたのでhaml形式になっています。

- if user_signed_in?
  %li= link_to "ログアウト", destroy_user_session_path
- else
  %li= link_to "ログイン", user_omniauth_authorize_path(:twitter)

user_signed_in?

なんて分かりやすい名前。素敵ですね。

動作確認

デフォルトのindexを削除します

$ rm public/index.html

適当なコントローラーを作成

$ rails g controller welcome index

routes.rb に追記

root :to => "welcome#index"

この状態でサーバーを起動してアクセスしてみてください。
ログインというリンクが表示されてそこからアクセスしTwitter認証されてログインができたら完了です。

間違っている部分などありましたらコメントなどでご指摘ください。

お疲れ様でした。