Google login using OmniAuth in Rails
Published: 2021-07-29 10:49:48

 After receiving numerous requests (O.k. not really “numerous” more like 1) I decided to show how to set up Omni Auth to use Google logins with your rails app. There’s a ton of info floating around on how to do it but like a lot of things in tech the methods change and become outdated. I recently used it on a test project so I figured it can be of use to someone. It’s not overly complicated but there are many steps you need to follow to make it work properly. Ready? Cool. lets get it crackin’.
	To start, head over to (https://console.developers.google.com/) and click “OAuth consent screen” .  Select “create project” and at the next menu add a “project name”. Click “create” to confirm then scroll down to Application home page and enter your web apps URL. For today we will be using a local host so for example you can enter https://localhost:3000. Navigate to the “User type” form and select “external”. Next scroll to “Developer Contact information” and enter your email. Select “SAVE AND CONTINUE”. Navigate to the “Credentials” tab on the left and select “OAuth client ID”. Under “Application type” form, select “web application”. 2 new selection should appear at the bottom of the page. Select “URIs* under the “Authorized redirect URIs” In the form enter http://localhost:3000/auth/google_oauth2/callback. Click save and continue. Once you finish creating the app your client id and secret should be listed. 
	Go back into your code editor and now we need to add 4 gems in your gemfile then run “bundle” in the terminal. 
```
gem 'omniauth'
gem 'omniauth-rails_csrf_protection'
gem 'omniauth-google-oauth2'
gem 'bcrypt'
```
Create or select the file.
**config\initializers\omniauth.rb** and enter the following info.
```
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET']
end
OmniAuth.config.allowed_request_methods = %i[get]
```
Remember when editing middleware its best to close and reload your puma server when you make changes.
In your **config\routes.rb** we will add a get route for oauth to use. Enter
```
get '/auth/google_oauth2/callback', to: 'sessions#google_auth'
```
Next you need to create an env file for your google client ID and secret. In the root folder of your app make a new file called **.env** enter the code then paste your secret and key.
```
GOOGLE_CLIENT_ID = <id here>
GOOGLE_CLIENT_SECRET = <key here>
```
Make sure to add your secret and key to your gitignore file or the key will be exposed when the repo is pushed.
Now head over to or create **app\controllers\sessions_controller.rb** and add the following inside it.
```
class SessionsController < ApplicationController

  def google_auth
    @user = User.find_or_create_by(uid: auth['uid']) do |u|
      u.name = auth['info']['name']
      u.email = auth['info']['email']
      u.image = auth['info']['image']
      access_token = auth
      u.google_token = auth.credentials.token
      refresh_token = auth.credentials.refresh_token
      u.google_refresh_token = refresh_token if refresh_token.present?
      u.password = SecureRandom.urlsafe_base64
    end
    log_in @user
    redirect_to menu_path
  end

private

  def auth
    request.env['omniauth.auth']
  end

end
```
The last line after the first “end” command you can change based on how your routes are set up in your app. O.K. now head to **app\controllers\application_controller.rb** and enter the following code
```
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  include SessionsHelper
end
```
Navigate to **app\helpers\sessions_helper.rb** and enter the following.
```
module SessionsHelper

  def log_in(user)
    session[:user_id] = user.id
  end

  def current_user
    current_user ||= User.find_by(id: session[:user_id])
  end

  def logged_in?
    !current_user.nil?
  end

  def log_out
    session.delete(:user_id)
    current_user = nil
  end
end
 ```
In your views you can add this code for a login button.
```
    <%= button_to "Sign in with Google", '/auth/google_oauth2', 
                    method: :get %>
```
Make the file **db\migrate\001_create_users.rb** then enter the following.
```
class CreateUsers < ActiveRecord::Migration[6.1]
  def change
    create_table :users do |t|
      t.string :name
      t.string :uid
      t.string :email
      t.string :google_token
      t.string :google_refresh_token
      t.string :image
      t.string :password_digest

      t.timestamps
    end
  end
end
```
In the terminal run 
```
rake db:migrate
``` 
and that’s it.  As of the date of this blog I can confirm this works so get it while it’s fresh!  Any questions or suggestions feel free to hit me up.