先日こちらの記事を参考に、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
