omniauthとdeviseでGoogleAPIのユーザー認証時に、クライアントIDが見つからないとエラーが出る
前提・実現したいこと
railsでTwitter型WEBサービスを制作しています。
deviseとomniauthでgoogle認証できるようにしたいのですが、Google
側から「クライアントIDが見つからない」と怒られてしまいます
主に参考にしたページはこちらです
deviseとomniauthを使った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