gem omniauth-google-oauth2를 사용하여 Google 인증 사용 (Rails5 버전)

요 전날 여기의 기사를 참조하여 omniauth-google-oauth2를 사용하여 Google 인증을 시도했습니다.

대체로는 그대로 움직였지만, 기사가 쓰여지고 나서 2년 이상 서 있어, 움직이지 않는 부분도 있었기 때문에, 비망록으로서 구축 순서를 남기고 싶습니다.

리포지토리는 이쪽.
htps : // 기주 b. 이 m / k r / 쿠에타 - 오 m에 맞는 th-o-g-o th 2 - st

Google 측 설정



Google 측의 설정은 참고로 했다 기사 대로에 하면 거의 거의 괜찮습니다.

준비



파일 설치



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

좋은 웹페이지 즐겨찾기