Devise + omniauth + omniauth-google-oauth2 Implement google login with There were various articles, but I will keep it as a memorandum so that I will not forget it for the time being
See here First of all Please issue the client ID and client secret.
Once the client ID and client secret are issued Add to Gemfile
Gemfile
#abridgement
gem 'devise'
gem 'omniauth'
gem 'omniauth-google-oauth2'
...
terminal
$ bundle install
terminal
$ rails g devise:install
termina
$ rails g devise user
2020******_add_column_to_users.rb
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
add_column :users, :provider, :string
add_column :users, :uid, :string
add_column :users, :token, :string
add_column :users, :meta, :string
end
end
$ rake db:migrate
app/models/user.rb
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable, :confirmable,
:omniauthable, omniauth_providers: %i(google)
...
...
...
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],
meta: auth.to_yaml)
end
user
end
end
All you need is: trackable and: omniauthable. If you want devise to have new functions, I think it's smarter to add new ones at that time. This time, the purpose is to log in for the time being, so this is fine!
Also, def self.find_for_google (auth) is a method that determines if the user is already known in the application when the callback is received. I will use it later.
It wasn't like I was on another site! !! !!
config/initializers/devise.rb
Devise.setup do |config|
require 'devise/orm/active_record'
config.omniauth :google_oauth2,
GOOGLE_CLIENT_ID="***sdps.apps.googleusercontent.com",
GOOGLE_CLIENT_SECRET="***********",
name: :google,
scope: %w(email)
end
The place of GOOGLE_CLIENT_ID is ENV = ['...'] There are many places where it is. .. It's Simple!! Regarding scope, if it is the default (state not described here), it will be email and profile. It's not required for user authentication, so let's just email
ruby:app/controllers/views/home.html.erb
= link_to image_tag('#.png'), omniauth_authorize_path(resource_name, provider)
Create an app / controllers / users directory and create a controller called omniauth_callbacks_controller.rb.
omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def google
@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
terminal
$ rails s
Then start the server and When I access http: // localhost: 3000 and press google login ...
Since routes.rb does not describe the destination to transition to after login, you are going to root. After logging in, if you try to display current_user.email etc. with view etc., you will see the email address of the logged-in user. !!