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認証されてログインができたら完了です。
間違っている部分などありましたらコメントなどでご指摘ください。
お疲れ様でした。