Login With Google Account Using Devise and Omniauth
This article shows you how to allow users to login using Devise and their Google accounts.Instead of using our own login system, we can use third party authentication services such as Facebook or Google. Using these services can be more sure and they also provide a better overall user experience. ...
This article shows you how to allow users to login using Devise and their Google accounts.Instead of using our own login system, we can use third party authentication services such as Facebook or Google. Using these services can be more sure and they also provide a better overall user experience.
Devise Installation
Add to your Gemfile
gem "devise"
Then bundle install
Next, you need to run the generator:
$ rails generate devise:install
Generate a devise model by running
$ rails generate devise MODEL_NAME
If your model name is User you will replace MODEL_NAME with User
Then run rake db:migrate
OmniAuth Google OAuth2 Installation
Add to your Gemfile
gem "omniauth-google-oauth2"
Then bundle install
Define your application id and secret in config/initializers/devise.rb
config.omniauth :google_oauth2, "GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", { }
You can get your GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET by setup Google API
- Go to https://console.developers.google.com
- Select your project.
- Click 'Enable and manage APIs'.
- Make sure "Contacts API" and "Google+ API" are on.
- Go to Credentials, then select the "OAuth consent screen" tab on top, and provide an 'EMAIL ADDRESS' and a 'PRODUCT NAME'
Then add the following to config/routes.rb so the callback routes are defined.
devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }
Make sure your model is omniauthable. Generally this is /app/models/user.rb
devise :omniauthable, :omniauth_providers => [:google_oauth2]
Setup callbacks controller
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController def google_oauth2 @user = User.from_omniauth(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
In your model app/models/user.rb
def self.from_omniauth(access_token) data = access_token.info user = User.where(:email => data["email"]).first unless user password = Devise.friendly_token[0,20] user = User.create(name: data["name"], email: data["email"], password: password, password_confirmation: password ) end user end
For your views you can login using:
<%= link_to "Sign in with Google", user_omniauth_authorize_path(:google_oauth2) %>
Get more information about omniauth-google-oauth2 here:
- https://github.com/zquestz/omniauth-google-oauth2
- https://richonrails.com/articles/google-authentication-in-ruby-on-rails
- https://www.sitepoint.com/rails-authentication-oauth-2-0-omniauth/