先日こちらの記事を参考に、omniauth-google-oauth2を使ってGoogle認証を試しました。

大体はそのままで動いたものの、記事が書かれてから2年以上立っており、動かない部分もあったため、備忘録として構築手順を残したいと思います。

リポジトリはこちら。 https://github.com/kter/qiita-omniauth-google-oauth2-test

Google側の設定

Google側の設定は参考にさせていただいた記事通りにやればほぼほぼ大丈夫です。

準備

ファイルの設置

RailsとDB(MySQL)はdocker-composeで動かすので、その設定を行います。

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

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

# for local development purpose
MYSQL_ROOT_PASSWORD=omni
MYSQL_USER=omni
MYSQL_PASSWORD=omni

.sec_env

GOOGLE_APP_ID=(クライアントID)
GOOGLE_APP_SECRET=(クライアントシークレット)

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

(空ファイル)

イメージのビルド

コンテナイメージをビルドします

docker-compose build

Railsアプリを作成する

docker-compose run web rails new . --force --database=mysql

設定

データベースの設定

  password: omni
  host: db

GemfileにDevise gemを追加

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

Userモデル設定

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.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に設定

<%= link_to 'Signin with Google', user_google_omniauth_authorize_path %>

<%= current_user.inspect %>

config/routes.rbのdevise_for :usersを下記行に置き換える

  devise_for :users, controllers: {
    omniauth_callbacks: "users/omniauth_callbacks"
  }

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

http://localhost/home/index

スクリーンショット 2018-12-29 21.09.28.png