$ vi Gemfile
gem 'omniauth' gem 'omniauth-github'
$ bundle install
$ vi config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do provider :github, ENV['NB_GITHUB_KEY'], ENV['NB_GITHUB_SECRET'] end
$ rails g model user provider:string uid:string screen_name:string name:string $ rake db:migrate
class User < ActiveRecord::Base def self.create_with_omniauth(auth) create! do |user| user.provider = auth['provider'] user.uid = auth['uid'] user.screen_name = auth['info']['nickname'] user.name = auth['info']['name'] end end end
$ rails g controller base $ rails g controller home index $ rails g controller sessions
$ rake routes
root 'home#index' get "home/index" get '/auth/:provider/callback', :to => 'sessions#callback' post '/auth/:provider/callback', :to => 'sessions#callback' get '/logout' => 'sessions#destroy', :as => :logout
$ vi app/controller/base_controller.rb
class BaseController < ActionController::Base protect_from_forgery
def login_required if session[:user_id] @current_user = User.find(session[:user_id]) else redirect_to root_path end end helper_method :current_user private def current_user @current_user ||= User.find(session[:user_id]) if session[:user_id] end end
$ vi app/controller/home_controller.rb
class HomeController < BaseController def index end end
$ vi app/controllers/session_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_path end def destroy session[:user_id] = nil redirect_to root_path end end
$ vi app/view/layout/application.rb
<% if current_user %> <%= current_user.name %> <%= link_to 'Logout', logout_path %> <% else %> <%= link_to 'Login', '/auth/github' %> <% end %>
S.Yatsuzuka