Devise.setup do |config|
config.omniauth :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET'], skip_jwt: true
OmniAuth.config.logger = Rails.logger if Rails.env.development? # debug用
end
[ ] Sns_Crendentialモデルの作成、マイグレーションファイルの作成、実行
class CreateSnsCredentials < ActiveRecord::Migration[5.2]
def change
create_table :sns_credentials do |t|
t.string :provider
t.string :uid
t.references :user, foreign_key: true
t.timestamps
end
end
end
[ ] 各モデルの編集
app/models/sns_credential.rb
class SnsCredential < ApplicationRecord
# ===== 以下を追加 =====
belongs_to :user
end
app/models/user.rb
class User < ApplicationRecord
# ===== 以下を追加 =====
has_many :sns_credential, dependent: :destroy
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable,
# ===== Omniauthを使用するためのオプションを追加 =====
:omniauthable, omniauth_providers: %i[google_oauth2]
class << self # ここからクラスメソッドで、メソッドの最初につける'self.'を省略できる
# SnsCredentialsテーブルにデータがないときの処理
def without_sns_data(auth)
user = User.where(email: auth.info.email).first
if user.present?
sns = SnsCredential.create(
uid: auth.uid,
provider: auth.provider,
user_id: user.id
)
else # User.newの記事があるが、newは保存までは行わないのでcreateで保存をかける
user = User.create(
name: auth.info.name, # デフォルトから追加したカラムがあれば記入
email: auth.info.email,
profile_image: auth.info.image, # デフォルトから追加したカラム
password: Devise.friendly_token(10) # 10文字の予測不能な文字列を生成する
)
sns = SnsCredential.create(
user_id: user.id,
uid: auth.uid,
provider: auth.provider
)
end
{ user:, sns: } # ハッシュ形式で呼び出し元に返す
end
# SnsCredentialsテーブルにデータがあるときの処理
def with_sns_data(auth, snscredential)
user = User.where(id: snscredential.user_id).first
# 変数userの中身が空文字, 空白文字, false, nilの時の処理
if user.blank?
user = User.create(
name: auth.info.name,
email: auth.info.email,
profile_image: auth.info.image,
password: Devise.friendly_token(10)
)
end
{ user: }
end
# Googleアカウントの情報をそれぞれの変数に格納して上記のメソッドに振り分ける処理
def find_oauth(auth)
uid = auth.uid
provider = auth.provider
snscredential = SnsCredential.where(uid:, provider:).first
if snscredential.present?
user = with_sns_data(auth, snscredential)[:user]
sns = snscredential
else
user = without_sns_data(auth)[:user]
sns = without_sns_data(auth)[:sns]
end
{ user:, sns: }
end
end
end
https://qiita.com/iloveomelette/items/b6e65caea88b6e86cfdd https://qiita.com/kazuooooo/items/47e7d426cbb33355590e Devise + Omniauth でgoogle認証機能を実装する。
[ ] Sns_Crendentialモデルの作成、マイグレーションファイルの作成、実行
[ ] 各モデルの編集 app/models/sns_credential.rb
app/models/user.rb
[ ] コントローラの作成 app/controllers/users/omniauth_callbacks_controller.rb