megutech

自身の備忘録として主にWEBサーバー周りの技術について投稿しています。

Devise OmniAuthでサービス先へリダイレクトする前にごにょごにょしたい

OmniAuth、ほとんど何もしなくてもOAuthを実装出来て便利ですよね。

でもサービス側へリダイレクトする直前にごにょごにょしたいことってありませんか?

ありませんか。そうですよね、普通は。。

まあ今回は普通じゃなかったんです。リダイレクト直前にちょっとSessionに色々小細工をしたかったんですが、OmniauthCallbacksController#passthruをオーバーライドしてもうまくいかなかったんで、その方法を共有します。

環境

Service Version
Ruby 3.0.2
Ruby on Rails 6.1
devise 4.8.0
omniauth 2.0.4
omniauth-google-oauth2 1.0.0
omniauth-rails_csrf_protection 1.0.0

対応

最初に書いた通り、リダイレクト寸前にごにょごにょしようとpassthruをオーバーライドしたんですが上手くいかず、それもそのはずコントローラーには到達していなかったんですね。

でもご安心ください。OmniAuthは大変によく完成されたgemです。そういったときのためのメソッドが用意されていました。

今回はリダイレクト時に追加されたparameterをsessionに格納してみましょう。

link_to :OAuth, user_xxxxxx_omniauth_authorize_path(hoge: :fuga)

config/initializers/omniauth.rb

OmniAuth.configure do |config|
  config.before_request_phase = ->(env) {
    request = ActionDispatch::Request.new(env.dup)
    request.session[:fuga] = request.params[:hoge]
  }
end

所感

所感というか愚痴というか。

なぜこういう方法を調べたかというと、別の方がなんとも頓珍漢な方法でOAuthまでにごにょごにょされておりまして、それはあんまりだろうと調べてみた結果こういうメソッドが用意されていたという。。

ちっとは自分で調べるという事くらいしてほしいですね。