gem omniauth-google-oauth2 및 gem devise를 사용한 Google 로그인 인증 구현
gem devise를 사용한 Google 인증을 통한 로그인 구현
간단하게 로그인 기능을 구현해 보겠습니다.
환경 구축
새 디렉토리 만들기
디렉토리로 이동하여$ bundle init
gem 'rails'
$ bundle install
$ bundle exec rails db:create
$ rbenv global 2.6.3
$ rbenv rehash
$ rails new . --skip-test
구현 전 준비
①gcp(google cloud platform) 설정
gem 'rails'
이런 화면이 나타납니다.
→ 애플리케이션 이름, 승인된 도메인 입력
→ 승인된 도메인은 외부에서 액세스할 수 있도록 나중에 ngrok에서 도메인을 설정합니다.
(ngrok 서버 연결 화면의 forwarding 부분의 도메인입니다)
→ 승인된 JavaScript 생성자 URI
localhost:3000
→ 승인된 리디렉션 URI
http://localhost:3000/users/auth/google_oauth2/callback
②ngrok 설정
· 다운로드 ngrok
→ ZIP 파일 다운로드
· 해동하여 설치
→ngrok.zip을 더블 클릭
· 계정 연결
$cd ~/Downloads/
에서 다운로드 디렉토리로 이동
→
$ ./ngrok authtoken ********
→
$ ./ngrok http 3000
성공 화면
구현
$ rails g controller static_pages home
routes.rb
Rails.application.routes.draw do
root to: "static_pages#home"
get 'static_pages/home'
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
$ rails g devise:install
$ rails g devise user
app/views/layouts/application.html.erb.에
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
추가
<h1>StaticPages#home</h1>
<% if user_signed_in? %>
<%= link_to "Sign out", destroy_user_session_path, method: :delete %>
<% else %>
<%= link_to "Sign in", new_user_session_path %>
<% end %>
application.html.erb
<!DOCTYPE html>
<html>
<head>
<title>TwitterAuthExample</title>
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
<%= yield %>
</body>
</html>
URI
http://localhost:3000
승인된 리디렉션 URI
http://localhost:3000/users/auth/google_oauth2/callback
$ EDITOR="vim" rails credentials:edit
google_oauth2:
client_id: xxxxx
client_secret: xxxxx
콘솔에서
Rails.application.credentials
실행하여 확인
gem 'omniauth-google-oauth2'
설치
config/initializer/devise.rb
다음 추가
config/initializer/devise.rb
config.omniauth :google_oauth2, Rails.application.credentials.google_oauth2[:client_id], Rails.application.credentials.google_oauth2[:client_secret], scope: 'email', redirect_url: "#{ENV['HOST']}/users/auth/google_oauth2/callback"
user.rb
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable,
:omniauthable, omniauth_providers: [:google_oauth2]
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.password = Devise.friendly_token[0,20]
end
end
end
$ rails g migration add_oauth_columns_to_users
마이그레이션 파일 내용
class AddOauthColumnsToUsers < ActiveRecord::Migration[6.0]
def change
add_column :users, :provider, :string
add_column :users, :uid, :string
end
end
Rails.application.routes.draw do
devise_for :users, controllers: {
omniauth_callbacks: 'users/omniauth_callbacks'
}
root to: "static_pages#home"
devise_scope :user do
get '/users/sign_out' => 'devise/sessions#destroy'
end
get 'static_pages/home'
end
$ rails g devise:controllers users -c=omniauth_callbacks
omniauth_callbacks_controller.rb
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'].except(:extra) # Removing extra as it can overflow some session stores
redirect_to new_user_registration_url, alert: @user.errors.full_messages.join("\n")
end
end
end
완성
Reference
이 문제에 관하여(gem omniauth-google-oauth2 및 gem devise를 사용한 Google 로그인 인증 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kenkentarou/items/1cdb64ee99a9a42b030d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)