gem omniauth-google-oauth2를 사용하여 Google 인증 사용 (Rails5 버전)
대체로는 그대로 움직였지만, 기사가 쓰여지고 나서 2년 이상 서 있어, 움직이지 않는 부분도 있었기 때문에, 비망록으로서 구축 순서를 남기고 싶습니다.
리포지토리는 이쪽.
htps : // 기주 b. 이 m / k r / 쿠에타 - 오 m에 맞는 th-o-g-o th 2 - st
Google 측 설정
Google 측의 설정은 참고로 했다 기사 대로에 하면 거의 거의 괜찮습니다.
준비
파일 설치
Rails와 DB(MySQL)는 docker-compose로 움직이기 때문에, 그 설정을 실시합니다.
Dockerfile
DockerfileFROM ruby:2.5.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
docker-compose.yml
docker-compose.ymlversion: '3'
services:
db:
image: mysql:5.7.23
env_file: .env
volumes:
- ./mysql-data:/var/lib/mysql
web:
build: .
command: bundle exec rails s -p 80 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "80:80"
depends_on:
- db
env_file: .sec_env
volumes:
db-data:
driver: local
.env
.env# for local development purpose
MYSQL_ROOT_PASSWORD=omni
MYSQL_USER=omni
MYSQL_PASSWORD=omni
.sec_env
.sec_envGOOGLE_APP_ID=(クライアントID)
GOOGLE_APP_SECRET=(クライアントシークレット)
Gemfile
Gemfilesource 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.5.1'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.2.2'
Gemfile.lock
Gemfile.lock(空ファイル)
이미지 빌드
컨테이너 이미지를 빌드합니다.
docker-compose build
Rails 앱 만들기
docker-compose run web rails new . --force --database=mysql
설정
데이터베이스 설정
config/database.yml password: omni
host: db
Gemfile에 Devise gem 추가
Gemfilegem 'devise'
gem 'omniauth'
gem 'omniauth-google-oauth2'
Devise 설치
docker-compose build
docker-compose run web bundle exec bin/rails g devise:install
docker-compose run web bundle exec bin/rails g devise user
마이그레이션 파일의 create_table에 설명
## Trackable
t.integer :sign_in_count, default: 0, null: false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
t.string :users, :provider
t.string :users, :uid
t.string :users, :token
t.string :users, :name
마이그레이션 반영
docker-compose run web bundle exec bin/rake db:create
docker-compose run web bundle exec bin/rake db:migrate
사용자 모델 설정
app/models/user.rbclass User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :trackable, :omniauthable, omniauth_providers: %i(google)
protected
def self.find_for_google(auth)
user = User.find_by(email: auth.info.email)
unless user
user = User.create(name: auth.info.name,
provider: auth.provider,
uid: auth.uid,
token: auth.credentials.token,
email: auth.info.email)
# password: Devise.friendly_token[0, 20],
# meta: auth.to_yaml)
end
user
end
end
config/initializers/devise.rb에 추가
config/initializers/devise.rb config.omniauth :google_oauth2,
ENV['GOOGLE_APP_ID'],
ENV['GOOGLE_APP_SECRET'],
name: :google,
scope: %w(email)
로그인 링크 설치용 페이지 작성
docker-compose run web bundle exec bin/rails g controller home index
로그인 링크를 app/views/home/index.html.erb로 설정
app/views/home/index.html.erb<%= link_to 'Signin with Google', user_google_omniauth_authorize_path %>
<%= current_user.inspect %>
config/routes.rb의 devise_for :users
를 다음 줄로 바꾸기
config/routes.rb devise_for :users, controllers: {
omniauth_callbacks: "users/omniauth_callbacks"
}
app/controllers/users/omniauth_callbacks_controller.rb에 다음 내용의 파일 만들기
app/controllers/users/omniauth_callbacks_controller.rbclass Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def google
@user = User.find_for_google(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
def after_sign_in_path_for(resource)
home_index_path
end
end
로그인 링크를 누르면 인증할 수 있습니다!
docker-compose up
Reference
이 문제에 관하여(gem omniauth-google-oauth2를 사용하여 Google 인증 사용 (Rails5 버전)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kter/items/1be63d7dca2a44a11e28
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
파일 설치
Rails와 DB(MySQL)는 docker-compose로 움직이기 때문에, 그 설정을 실시합니다.
Dockerfile
Dockerfile
FROM ruby:2.5.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
docker-compose.yml
docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7.23
env_file: .env
volumes:
- ./mysql-data:/var/lib/mysql
web:
build: .
command: bundle exec rails s -p 80 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "80:80"
depends_on:
- db
env_file: .sec_env
volumes:
db-data:
driver: local
.env
.env
# for local development purpose
MYSQL_ROOT_PASSWORD=omni
MYSQL_USER=omni
MYSQL_PASSWORD=omni
.sec_env
.sec_env
GOOGLE_APP_ID=(クライアントID)
GOOGLE_APP_SECRET=(クライアントシークレット)
Gemfile
Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.5.1'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.2.2'
Gemfile.lock
Gemfile.lock
(空ファイル)
이미지 빌드
컨테이너 이미지를 빌드합니다.
docker-compose build
Rails 앱 만들기
docker-compose run web rails new . --force --database=mysql
설정
데이터베이스 설정
config/database.yml
password: omni
host: db
Gemfile에 Devise gem 추가
Gemfile
gem 'devise'
gem 'omniauth'
gem 'omniauth-google-oauth2'
Devise 설치
docker-compose build
docker-compose run web bundle exec bin/rails g devise:install
docker-compose run web bundle exec bin/rails g devise user
마이그레이션 파일의 create_table에 설명
## Trackable
t.integer :sign_in_count, default: 0, null: false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
t.string :users, :provider
t.string :users, :uid
t.string :users, :token
t.string :users, :name
마이그레이션 반영
docker-compose run web bundle exec bin/rake db:create
docker-compose run web bundle exec bin/rake db:migrate
사용자 모델 설정
app/models/user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :trackable, :omniauthable, omniauth_providers: %i(google)
protected
def self.find_for_google(auth)
user = User.find_by(email: auth.info.email)
unless user
user = User.create(name: auth.info.name,
provider: auth.provider,
uid: auth.uid,
token: auth.credentials.token,
email: auth.info.email)
# password: Devise.friendly_token[0, 20],
# meta: auth.to_yaml)
end
user
end
end
config/initializers/devise.rb에 추가
config/initializers/devise.rb
config.omniauth :google_oauth2,
ENV['GOOGLE_APP_ID'],
ENV['GOOGLE_APP_SECRET'],
name: :google,
scope: %w(email)
로그인 링크 설치용 페이지 작성
docker-compose run web bundle exec bin/rails g controller home index
로그인 링크를 app/views/home/index.html.erb로 설정
app/views/home/index.html.erb
<%= link_to 'Signin with Google', user_google_omniauth_authorize_path %>
<%= current_user.inspect %>
config/routes.rb의
devise_for :users
를 다음 줄로 바꾸기config/routes.rb
devise_for :users, controllers: {
omniauth_callbacks: "users/omniauth_callbacks"
}
app/controllers/users/omniauth_callbacks_controller.rb에 다음 내용의 파일 만들기
app/controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def google
@user = User.find_for_google(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
def after_sign_in_path_for(resource)
home_index_path
end
end
로그인 링크를 누르면 인증할 수 있습니다!
docker-compose up
Reference
이 문제에 관하여(gem omniauth-google-oauth2를 사용하여 Google 인증 사용 (Rails5 버전)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kter/items/1be63d7dca2a44a11e28텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)