Edited at

OmniAuth

More than 5 years have passed since last update.


OmniAuth

様々なプロバイダーのログイン認証を手軽に実現するプラグイン。


公式リポジトリ

https://github.com/intridea/omniauth


公式ドキュメント

https://github.com/intridea/omniauth/wiki


The Ruby Toolbox

https://www.ruby-toolbox.com/projects/omniauth


参考ドキュメント

簡単なOmniAuth - ASCIIcasts

Rails3.2.3 + omniauth-twitter New App - I can't change the world.


インストール


For GitHub

Gemfileに、omniauth、omniauth-githubを記述する。


Gemfile

gem 'omniauth'

gem 'omniauth-github'

インストールする。

$ bundle install


初期設定


For GitHub

設定ファイルを新規作成する。

CLIENT_IDSECRETには、GitHubで登録したアプリケーションのClient ID、Secretを設定する。


config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do

provider :github, "CLIENT_ID", "SECRET"
end

セッションコントローラを新規作成する。

rails g controller sessions

create app/controllers/sessions_controller.rb
invoke erb
create app/views/sessions
invoke helper
create app/helpers/sessions_helper.rb
invoke assets
invoke coffee
create app/assets/javascripts/sessions.js.coffee
invoke scss
create app/assets/stylesheets/sessions.css.scss


app/controllers/sessions_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
reset_session
redirect_to root_path
end
end


ルーティングを追加する。


config/routes.rb

match "/auth/:provider/callback" => "sessions#callback"

match "/signout" => "sessions#destroy"

Userモデルを新規作成する。

$ rails generate model user

invoke active_record
create db/migrate/20120418060936_create_users.rb
create app/models/user.rb


db/migrate/20120418060936_create_users.rb

class CreateUsers < ActiveRecord::Migration

def change
create_table :users do |t|
t.string :provider, :null => false
t.string :uid, :null => false
t.string :name, :null => false
t.string :nickname
t.string :image
t.string :token

t.timestamps
end
end
end



app/models/user.rb

class User < ActiveRecord::Base

def self.create_with_omniauth(auth)
create! do |user|
user.provider = auth["provider"]
user.uid = auth["uid"]
user.name = auth["info"]["name"]
user.nickname = auth["info"]["nickname"]
user.image = auth["extra"]["raw_info"]["avatar_url"]
user.token = auth["credentials"]["token"]
end
end
end

$ rake db:migrate

== CreateUsers: migrating ====================================================
-- create_table(:users)
-> 0.0021s
== CreateUsers: migrated (0.0022s) ===========================================

ヘルパーメソッドを追加する。


app/controllers/application_controller.rb

class ApplicationController < ActionController::Base

protect_from_forgery

helper_method :current_user

private

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


ビューにログイン、ログアウトのリンクを追加する。

<% if current_user %>

<%= link_to "Sign out", signout_path
<% else %>

<%= link_to "Sign in with GitHub", "/>
<% end %>


OmniAuthで取得可能な情報


For GitHub

OmniAuthで取得出来る情報は以下の通り。

{"provider"=>"github",

"uid"=>572020,
"info"=>
{"nickname"=>"FakeStarBaby",
"email"=>nil,
"name"=>"Yoshinori Hirasawa",
"urls"=>
{"GitHub"=>"https://github.com/FakeStarBaby",
"Blog"=>"http://twitter.com/#!/fakestarbaby"}},
"credentials"=>
{"token"=>"1234567890123456789012345678901234567890", "expires"=>false},
"extra"=>
{"raw_info"=>
{"public_gists"=>10,
"type"=>"User",
"blog"=>"http://twitter.com/#!/fakestarbaby",
"location"=>"Tokyo",
"html_url"=>"https://github.com/FakeStarBaby",
"created_at"=>"2011-01-19T05:08:56Z",
"email"=>nil,
"public_repos"=>51,
"followers"=>16,
"company"=>"Japan",
"hireable"=>false,
"bio"=>nil,
"url"=>"https://api.github.com/users/FakeStarBaby",
"following"=>69,
"login"=>"FakeStarBaby",
"name"=>"Yoshinori Hirasawa",
"gravatar_id"=>"0e3e4d3a8e69ccae1e9b9dcc219f3f1f",
"avatar_url"=>
"https://secure.gravatar.com/avatar/0e3e4d3a8e69ccae1e9b9dcc219f3f1f?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png",
"id"=>572020}}}