質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Q&A

解決済

1回答

2987閲覧

[Rails]deviseとomniauthを用いたGoogle認証のエラーが解消できない

hgka3782

総合スコア1

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

0グッド

0クリップ

投稿2020/11/09 06:22

Google認証のエラーを解消したいです。
以下のエラーをと同じ状況の記事が見つからず、(英語の記事を見つけたが、よく理解できませんでした)苦戦しています。ご教授のほどよろしくお願いいたします。

ruby on railsでアプリを作っているのですが、ログイン機能にdeviseを導入し、google認証も追加しようとした際にエラーが出ました。deviseのみのログイン機能は正常に機能しています。

[開発環境]
Mac OS 10.15.7

Rails 5.1.5
devise version指定なし

発生している問題・エラーメッセージ

イメージ説明

#development.log Started POST "/users/auth/google_oauth2" for ::1 at 2020-11-09 14:51:04 +0900 (google_oauth2) Request phase initiated.

該当のソースコード

app/controllers/users/omniauth_callbacks_controller.rb

ruby

1 2class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 3 # You should configure your model like this: 4 # devise :omniauthable, omniauth_providers: [:twitter] 5 6 def google_oauth2 7 @user = User.from_omniauth(request.env['omniauth.auth']) 8 9 if @user.persisted? 10 flash[:notice] = I18n.t 'devise.omniauth_callbacks.success', kind: 'Google' 11 sign_in_and_redirect @user, event: :authentication 12 else 13 session['devise.google_data'] = request.env['omniauth.auth'].except(:extra) 14 redirect_to new_user_registration_url, alert: @user.errors.full_messages.join("\n") 15 end 16 end 17end

app/models/user.rb

ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable, 6 :omniauthable, omniauth_providers: %i[google_oauth2] 7 8 protected 9 # コールバックを受けた時にユーザが既にアプリケーションの中で認知されているかどうかを判断する 10 def self.from_omniauth(access_token) 11 data = access_token.info 12 user = User.where(email: data['email']).first 13 # ユーザーがいない場合は作成する 14 unless user 15 user = User.create(name: data['name'], 16 email: data['email'], 17 password: Devise.friendly_token[0,20]) 18 end 19 user 20 end 21end

config/routes.rb

Rails.application.routes.draw do root to: "homes#index" devise_for :users, controllers: { sessions: 'users/sessions', registrations: "users/registrations", omniauth_callbacks: 'users/omniauth_callbacks' } resources :users, only: [:index] resources :reviews end

試したこと

  • gem 'omniauth-rails_csrf_protection' 追加
  • nameカラムを追加
  • Contacts API 有効にする
  • google設定した際のクライアントIDとシークレットIDはgem 'dotenv-rails'を用いて、.envに記載してます。
  • config/initializers/omniauth.rb作成,編集

config/initializers/omniauth.rb

1Rails.application.config.middleware.use OmniAuth::Builder do 2 {:provider_ignores_state => true} 3end

補足情報(FW/ツールのバージョンなど)

gem 'omniauth-rails_csrf_protection'を追加する前は、このようなログが出ていました。

log/development.log (google_oauth2) Callback phase initiated. (google_oauth2) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected Processing by Users::OmniauthCallbacksController#failure as HTML Redirected to http://localhost:3000/users/sign_in Completed 302 Found in 2ms (ActiveRecord: 0.0ms)

google側はこのような感じになっていますが、関係はあるでしょうか?イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

initializers/devise.rb

1config.omniauth :google_oauth2,ENV['GOOGLE_CLIENT_ID'], 2 ENV['GOOGLE_CLIENT_SECRET'], 3 scope: 'email,calendar', 4 redirect_uri: "#{ENV['HOST_DOMAIN']}/users/auth/google_oauth2/callback"

↓変更後↓

initializers/devise.rb

1config.omniauth :google_oauth2,ENV['GOOGLE_CLIENT_ID'], 2 ENV['GOOGLE_CLIENT_SECRET']

変更後、無事にgoogleログインできました。
余計なものが書かれちゃっていたみたいです。。。
ちゃんと書かれているコードの意味を理解して次に活かしていきますm(_ _)m

投稿2020/11/10 05:29

hgka3782

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問