1 はじめに
以下の画像のようにGoogle認証を取り入れており、以下の画像までは実行できるのですが、アカウントを選択して実行してもうまくログインできなくなるという現象が起こりました。これを解決するのに少し時間がかかったので、備忘録として投稿します。
2 解決のための流れ
- Google Cloud Consoleでのプロジェクト及びリダイレクトURLの確認
- OAuth レート上限の確認
- Rails側でデバッグ
上記の流れで確認していきました。
Google Cloud Consoleでのプロジェクト及びリダイレクトURLの確認
まずは、Google Cloud Consoleにログインをして自分が作成したプロジェクトを間違えて消していないか。次にリダイレクトURLが間違えていないか確認しました。
ここでの発見はリダイレクトURLではhttp://localhost:3000
のように設定しているので、自分でアプリ作成のために作成したルーティングのhttp://localhost:3000/users
なども必要に応じて追加する必要があるなと感じました。毎回ログインするときにトップ画面に戻るのは手間なので。
今回はこちらには何の問題もありませんでした。
OAuth レート上限の確認
一応問題ないとは思いますが、まさかと思い確認しました(私の場合はYoutube apiも使用しているため)。今の私のアプリの内容的に、上限にいくはずもなく問題ありませんでした。
正直ここで詰まってしまい、次に何を確認すれば良いのかわからなくなり、ChatGptに解決する手段を聞いてみました。それが次の手段です。
Rails側でデバッグ
Rails.logger.debug "OmniAuth response: #{request.env['omniauth.auth'].inspect}"
上記のコードを追記してあげることで、OmniAuthレスポンスの内容を確認できることがわかったので、実施してみました。簡単にこのコードの説明をするとrequest.env['omniauth.auth']
の中にGoogle認証した時のデータが入っているのでその中身について確認するためのコードです。
上記のコードを追加して、Google認証を実施した結果として、しっかりとデータが取得できていることがわかりました。つまりデータは取得できているが、最後にテーブルにデータを保存することができていないことが、ここで発見されました。
これをみた時に、まさかと思い出したのですが、Google認証をした後に、users/editにパスが飛ぶようにしており、そこではユーザーの他のデータを追加させようとしていたことを思い出しました。そして追加のデータにバリデーションをつけていたので、バリデーションをしていない、Google認証のデータは取得できなかったのです。
問題の解決
Google認証した後に、バリデーションが機能するようにしようと思います。
そのために調べたところ、条件付きバリデーションがあったので、こちらを参考にして以下の記述を追記をしました。
with_options if: :google_auth? do |auth|
auth.validates :name, presence: true, length: { maximum: 15 }
auth.validates :profile, presence: true, length: { maximum: 100 }
auth.validates :muscle_training_history, numericality: { only_integer: true, greater_than_or_equal_to: 0, message: "数字を入力してください" }
end
private
def google_auth?
provider == 'google_oauth2'
end
with_options if: :google_auth?
の部分で、もしgoogle_auth?
が正しければ実行するという記述になっており、google_auth?
は下の方に作成しております。Google認証したときには、providerカラム
は'google_oauth2'になるはずなので、この記述でうまくいきます。
おわりに
今回は思わぬところでGoogle認証ができなくなりましたが、そのおかげで条件付きバリデーションを勉強できたのでよかったです。これからもポートフォリオ完成に向けて精進していきます。最後まで閲覧いただき誠にありがとうございました。