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

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

ただいまの
回答率

89.64%

【Rails】omniauthとdeviseでGoogleAPIのユーザー認証時に、クライアントIDが見つからないとエラーが出てしまう

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 549

k_yusuke

score 13

前提・実現したいこと

railsでTwitter型WEBサービスを制作しています。
deviseとomniauthでgoogle認証できるようにしたいのですが、Google
側から「クライアントIDが見つからない」と怒られてしまいます
主に参考にしたページはこちらです

deviseとomniauthを使ったGoogle認証の流れ-in Qiita

googleからのログイン実装-in Qiita

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

写真のようにError: invalid_request
Missing required parameter: client_idと表示されてしまいます。

![Google認証リンク先](233d78ac7bf108c9c958f8cb1ba390f6.png)

該当のソースコード

Gemfile

source 'https://rubygems.org'


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.0.0'


#easy test
group :development, :test do
  gem 'rspec-rails', '~> 3.6'
  gem "capybara"

end
# meke user administor
gem 'rails_admin'
# easier form create
gem 'simple_form'
# Use sqlite3 as the database for Active Record
gem 'sqlite3', '~> 1.3.6'
# image upload
gem 'carrierwave'
# make easier restigation and login 
gem 'devise'
gem 'omniauth'
gem 'omniauth-google-oauth2'
#user admin gem
gem 'cancancan'

group :development, :test do
  gem 'dotenv-rails'


/model/User.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable,:omniauthable

  def self.find_for_google_oauth2(auth)
  user = User.where(email: auth.info.email).first
  unless user
  user = User.create(name:     auth.info.name,
                     provider: auth.provider,
                     uid:      auth.uid,
                     email:    auth.info.email,
                     token:    auth.credentials.token,
                     password: Devise.friendly_token[0, 20])
  end
  user
  end
  def remember_me
    true
  end
end


/config/initializer/devise.rb

  # so you need to do it manually. For the users scope, it would be:
  # config.omniauth_path_prefix = '/my_engine/users/auth'

  # ==> Turbolinks configuration
  # If your app is using Turbolinks, Turbolinks::Controller needs to be included to make redirection work correctly:
  #
  # ActiveSupport.on_load(:devise_failure_app) do
  #   include Turbolinks::Controller
  # end

  # ==> Configuration for :registerable

  # When set to false, does not sign a user in automatically after their password is
  # changed. Defaults to true, so a user is signed in automatically after changing a password.
  # config.sign_in_after_change_password = true
  config.omniauth :google_oauth2,Rails.application.secrets.google_client_id,Rails.application.secrets.google_client_secret
end


/config/initializer/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2,
    Rails.application.secrets.google_client_id,
    Rails.application.secrets.google_client_secret,
    {
# ログイン後にGoogle Calendarのデータを取得したいので、scopeに
# https://www.googleapis.com/auth/calendarを記述しています。
# また、promptとaccess_typeを以下の設定にするとrefresh_tokenが得られる
# (その他の組み合わせは試していません)。
      scope: "https://www.googleapis.com/auth/userinfo.email,
              https://www.googleapis.com/auth/userinfo.profile,
              https://www.googleapis.com/auth/calendar",
      prompt: "select_account",
      access_type: "offline"
    }

end


/config/secrets.yml

# Be sure to restart your server when you modify this file.

# Your secret key is used for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!

# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
# You can use `rails secret` to generate a secure secret key.

# Make sure the secrets in this file are kept private
# if you're sharing your code publicly.

development:
  secret_key_base: 77c01ff0bf353d58ef52fc73e2707886ed0b5218cd057fcb7a4404702406cc87bd6fe482f68103fc35377dadfc3fec6550df0e1fb29e941134e1f5958e561c95

test:
  secret_key_base: 5124f54d8a7cb1113e4aa5ae65994ea0a0d5c73d2971c082fb9d44e1b2d2219e8c0f0f77181662084df44cd66f3e9c42db9494642ea57060c1026ad4f410d62c

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
#idとシークレットは質問用に改変しています
google_client_id: 240395658877-np5n29adf9gn3jjn88awdawdawv9gu84pl4p.apps.googleusercontent.com
google_client_secret: hAIRJiARkDFB6vGNadawdB04W


app/controllers/users/omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def google_oauth2
    @user = User.find_for_google_oauth2(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
end


/config/routes

Rails.application.routes.draw do


  mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
  root 'static_pages#home'
  get '/about'=>'static_pages#about'

    devise_for :users, controllers: {
    registrations: 'users/registrations',
    sessions: "users/sessions",
    omniauth_callbacks: "users/omniauth_callbacks",
  }

  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

試したこと

↓の記事を参考にしました。figaroというgemを使って環境変数にクライアントIDを定義するという方法だったのですが、記事は本番環境を想定していて、開発環境下の自分が同じ操作をしてよいものかわからず、保留しています。
figaroを使って環境変数にクライアントIDを定義する
複数ユーザーでログインしていると重複リダイレクトで上記のようなエラーが出るという記事(記事のurlは忘れてしまいました)を見て、ほかのユーザーをログアウトしてみたのですが、結果は同じでした。

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

cloud9使用
Rails 5.0.7.2

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

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

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Rubyに関する質問
  • 【Rails】omniauthとdeviseでGoogleAPIのユーザー認証時に、クライアントIDが見つからないとエラーが出てしまう