In this blog i’ll show how to integrate Google authentication using devise.To install devise you can refer to my blog here.
Step:1
Add the gems in your gem file
gem ‘devise’
gem 'omniauth'
gem 'omniauth-google-oauth2'
Run the “bundle install” command to install the gem.
Step:2
You need two more columns to store provider type and userid given from google
rails g migration AddProviderToUsers provider:string uid:string
Runt rake db:migrate to insert the columns in users table.
Step:3
Go the user model “user.rb” and add the following line
devise : omniauthable
Step:4
First of all you need to create an app in google to get “Client key” and “Client Secret key”
https://code.google.com/apis/console/
Create an app and get the Client id and secret key.
Step:5
Now you need to declare the provider name and client id and key.Go to the file config/initializers/devise.rb and the following line
require 'omniauth-google-oauth2'
config.omniauth :google_oauth2, "APP_ID", "APP_SECRET", { access_type: "offline", approval_prompt: "" }
Step:6
Go to your layout file and the following block
<% if user_signed_in? %>
Signed in as <%= current_user.name %>. Not you?
<%= link_to "Sign out", destroy_user_session_path,:method => :delete %>
<% else %>
<%= link_to "Sign up", new_user_registration_path %> or
<%= link_to "Sign in", new_user_session_path %>
<%= link_to "Sign in with Google", user_omniauth_authorize_path(:google_oauth2) %>
<% end %>
Step:7
Before creating the call back method change your route like below
devise_for :users, :controllers => { : omniauth_callbacks => "omniauth_callbacks" }
Step:8
Create a new controller named as “omniauth_callbacks_controller.rb”.Add the following method in it.
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def google_oauth2
@user = User.find_for_google_oauth2(request.env["omniauth.auth"], current_user)
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
Step:9
Add the following block in your user model.
def self.find_for_google_oauth2(access_token, signed_in_resource=nil)
data = access_token.info
user = User.where(:provider => access_token.provider, :uid => access_token.uid ).first
if user
return user
else
registered_user = User.where(:email => access_token.info.email).first
if registered_user
return registered_user
else
user = User.create(name: data["name"],
provider:access_token.provider,
email: data["email"],
uid: access_token.uid ,
password: Devise.friendly_token[0,20],
)
end
end
end
Now we are done with google integration with devise.