動かざることバグの如し

近づきたいよ 君の理想に

Railsとomniauth-twitterを使ってログインする

環境

まずは本当に「連携」だけしてみる

つまりモデルを作らない(データを保存しない)

環境変数の設定

export TWITTER_KEY=AAAAAAA
export TWITTER_SECRET=AAAAAAA

config/initializers/omniauth.rbを新規作成

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET']
end

これでhttp://localhost:3000/auth/twitterにアクセスすると認証できる そのあとにNo route matches [GET] "/auth/twitter/callback"って怒られれば成功

次にコールバック後の挙動を設定していく

まずはセッションコントローラーの作成

rails g controller sessions

app/controllers/sessions_controller.rbを以下のようにする

class SessionsController < ApplicationController
    def create
        data = request.env['omniauth.auth']
        session[:user] = data.info
        redirect_to root_path, notice: 'ログインしました'
    end

    def destroy
        session[:user] = nil
        redirect_to root_path, notice: 'ログアウトしました'
    end

    def oauth_failure
        redirect_to root_path, notice: 'ログインに失敗しました'
    end
end

root_pathのためのhomeコントローラー作成

rails g controller home index

app/views/home/index.html.slimを作成して以下のようにする

h1 Twitter連携
- if notice
    p = notice

- if session[:user]
    p = session[:user].to_json
    =link_to 'ログアウト', '/auth/signout'
- else
    =link_to 'Twitterでログイン', '/auth/twitter'

最後にroutes.rbにてルーティングの設定

Rails.application.routes.draw do
  get 'home/index'
  root 'home#index'

  get 'auth/:provider/callback' => 'sessions#create'
  get 'auth/signout' => 'sessions#destroy'

これでおk 以下は例のJSON

{"nickname":"amanekey","name":"あまねき","email":null,"location":"","image":"http://pbs.twimg.com/profile_images/664096442835820544/edyJrRSj_normal.jpg","description":"駅メモer必見:http://t.co/KaeV3KT6xS\n\n選ばれたのは白猫でした","urls":{"Website":null,"Twitter":"https://twitter.com/amanekey"}}

Facebookも追加してみる

gem追加

gem 'omniauth-facebook'

同じく環境変数追加

export FACEBOOK_KEY=AAAAAAAA
export FACEBOOK_SECRET=AAAAAAAA

omniauth.rbFacebook追加

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET']
  provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET']
end

あとはviewに顔本ログインリンクを追加するだけ

h1 Twitter連携
- if notice
    p = notice

- if session[:user]
    p = session[:user].to_json
    =link_to 'ログアウト', '/auth/signout'
- else
    =link_to 'Twitterでログイン', '/auth/twitter'
    =link_to 'Facebookでログイン', '/auth/facebook'