

### 前提・実現したいこと

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

[deviseとomniauthを使ったGoogle認証の流れ-in
Qiita](https://qiita.com/s-show/items/9de77de4eb480f779aa4)

[googleからのログイン実装-in
Qiita](https://qiita.com/ttaka66/items/9ea3052a6f17a0b8f5fc)

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

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

[code]

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

### 該当のソースコード

Gemfile

[code]

    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'
    
[/code]

/model/User.rb

[code]

    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
    
    
[/code]

/config/initializer/devise.rb

[code]

      # 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
    
[/code]

/config/initializer/omniauth.rb

[code]

    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
    
[/code]

/config/secrets.yml

[code]

    # 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
    
[/code]

app/controllers/users/omniauth_callbacks_controller.rb

[code]

    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
    
    
[/code]

/config/routes

[code]

    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
    
    
[/code]

### 試したこと

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

### 補足情報（FW/ツールのバージョンなど）

cloud9使用  
Rails 5.0.7.2


CC BY-SA 4.0
2019-07-27T06:12:06.433
56939
2020-07-06T05:08:20.893
2019-07-27T14:07:19.537
19110
35273
question
ruby-on-rails ruby
omniauthとdeviseでGoogleAPIのユーザー認証時に、クライアントIDが見つからないとエラーが出る


以下の問題がありそうです。

  * config/initializers/devise.rb の "s" が抜けている
  * Deviseを使用する場合の設定と、使用しない場合の設定が混在している

[公式のREADMEのDeviseの項](https://github.com/zquestz/omniauth-google-oauth2#devise)
に、以下の記載があります。

> First define your application id and secret in
> config/initializers/devise.rb. Do not use the snippet mentioned in the Usage
> section.  
>  （中略）  
>  NOTE: If you are using this gem with devise with above snippet in
> config/initializers/devise.rb then do not create
> config/initializers/omniauth.rb which will conflict with devise
> configurations.

Deviseを使用する場合は、config/initializers/devise.rb に必要な設定を記載し、
config/initializers/omniauth.rb は作成しないでくださいとのことです。

まだ解決されていないようでしたらお試しください。


CC BY-SA 4.0
2019-10-06T15:50:37.303
59515
2019-10-06T15:50:37.303
36098
56939
answer