##1. 必要なgemのインストール
gem 'devise'
gem 'omniauth'
gem 'omniauth-google-oauth2'
$ bundle install
$ rails g devise:install
$ rails g devise user
##2. deviseが作成したUserモデルにOmniAuthに必要なカラムを追加
$ rails g migration add_omniauth_to_users
class AddOmniauthToUsers < ActiveRecord::Migration
def change
add_column :users, :provider, :string
add_column :users, :uid, :string
add_column :users, :name, :string
add_column :users, :token, :string
end
end
$ rake db:migrate
##3. deviseでOmniAuthを有効にする
deviseメソッドに:omniauthableを追加
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, and :timeoutable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :omniauthable
end
##4. 任意のページにログインするためのリンクを貼る
<%= link_to 'Signin with Google', user_omniauth_authorize_path(:google_oauth2) %>
##5. ClientIDの取得
GoogleにてクライアントIDを取得する
https://console.developers.google.com/project
上記URLより
①プロジェクトを作成
②『Contacts API』『Google+ API』の2つをONにする
③認証情報を追加する
④認証済みのjavascript生成元に以下を入力(本番環境は別)
https://localhost:3000
⑤認証済みのリダイレクトURLに以下を入力(本番環境は別)
http://localhost:3000/users/auth/google_oauth2/callback
⑥『Client ID』と『Client Secret』をコピーする
⑦config/secrets.ymlに貼り付ける
development:
secret_key_base: XXXXXXXXXXXXXXXXX
google_client_id: 取得した Client ID
google_client_secret: 取得した Client Secret
⑧config/initializers/devise.rbを編集する
config.omniauth :google_oauth2,
Rails.application.secrets.google_client_id,
Rails.application.secrets.google_client_secret
##6. Rails側の実装
###ルーティングを定義
devise_for :users, controllers: {
omniauth_callbacks: "users/omniauth_callbacks"
}
###コールバックで呼び出されるコントローラーを定義
app/controllers/users ディレクトリを作成し、その中に omniauth_callbacks_controller.rb というコントローラーを作成
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def google_oauth2
@user = User.find_for_google_oauth2(request.env["omniauth.auth"])
# 保存済みかどうかのチェック
if @user.persisted?
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Google"
sign_in_and_redirect @user, :event => :authentication
else
session["devise.google_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
end
###Userモデルのfind_for_google_oauth2メソッドを定義
def self.find_for_google_oauth2(auth)
user = User.where(email: auth.info.email).first
unless user
user = User.create(name: auth.info.name,
provider: auth.provider,
uid: auth.uid,
email: auth.info.email,
token: auth.credentials.token,
password: Devise.friendly_token[0, 20])
end
user
end