toke04 / ruby-flash-card

3 stars 0 forks source link

本番環境でgithubアカウントを利用したユーザー登録ができない問題を調べる #151

Closed toke04 closed 10 months ago

toke04 commented 10 months ago

参考文献

rails + github認証の基本的な流れ https://sakitadaiki.hatenablog.com/entry/2021/07/23/152005

まず必要な事として以下がある

  1. fly.ioのログを確認する
  2. githubログイン機能のライブラリの仕様を確認する

[前提条件] 2023/11/02(木)の13時前後にとあるユーザーの方が新規登録に失敗した。 最近のユーザーの新規登録を確認した所、以下のように11/02(木)に3名の新規会員ユーザーがいる。 Image しかし、面接官の方は新規会員登録に失敗した。

実はこの問題、過去にも報告があった。 https://discord.com/channels/715806612824260640/1067626219237036092/1156519096494604348

Image

問題が報告された日付は9/27、 その日に新規会員できたユーザーは以下 Image

上記のように72人の新規会員がいた。 しかし、昨日と9月に失敗報告があった。

ちなみに自分の環境下で、以下の端末では成功が確認できている

ブラウザ(利用OSはMacOS Big Sur)
- Safari
- Google Chrome

Iphone
- Safari
- Google Chrome

デスクトップアプリ
- Line(Iphone Mac 両方から成功)

[解決手段] 1に関して、 fly.ioのログ保管期間が短いゆえ、過去のユーザーが失敗した際のログを追うのは難しそう。

2の「ライブラリの仕様を確認する」が現実的かも。

ここで私が予想する原因を書く

a. firefoxからアクセスした? b. githubの認証設定の問題?

aは結構あり得るかもしれない。 firefoxにgituhubログインが対応していないのかもしれない ↑関係ないことが分かった。 リサさんから以下のような報告を頂いているから

Image

bは少し可能性薄いかも。 もしbが原因なら、もっと報告が上がってもおかしくないような気がする。

[現時点でのまとめ(2023/11/03)] ライブラリの仕様を確認するのが早い気がする。 ちょっと完全に予想がつかないが、

となると、ライブラリの仕様 or 私のコーディングに問題がある気がする。 調査次第、報告する

[追記] 9月に失敗報告が上がった次の日以降のログを確認すると、 9月28日~2023年9月30日の間に32人の新規会員ユーザーがいたことが分かった。

スクリーンショット 2023-11-03 9 32 08

ほとんどの方が成功している事を考えると、本当にちょっとした何かが原因でgithub認証に失敗しているように思う。 githubのissueを見に行った方が良いかも

[2023/11/05] githubの方で認証が済んだ後のコールバックの設定は正しそう

スクリーンショット 2023-11-05 10 05 51

仕組みとして、最初にライブラリで実装されている、ここにアクセスを飛ばす。

class Devise::OmniauthCallbacksController < DeviseController
  prepend_before_action { request.env["devise.skip_timeout"] = true }

  def passthru
    render status: 404, plain: "Not found. Authentication passthru."
  end

ここでの認証が終わったら、自分で作ったgithub認証のアクションに飛ばす

スクリーンショット 2023-11-05 10 07 23

アクションの内容

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def github
    @user = User.find_for_github_oauth(request.env['omniauth.auth'])
    if @user.persisted?
      sign_in_and_redirect @user, event: :authentication
      set_flash_message(:notice, :success, kind: 'Github') if is_navigational_format?

[csrfについて] csrfは関係なさそうに思える。 https://midorimici.com/posts/rails-api-csrf なぜなら、このリクエストを送っている箇所は、このようにrailsで用意したauthenticity_tokenを送信しているからである。

スクリーンショット 2023-11-05 10 23 49

なので、csrfで認証に落ちるというのはありえない

toke04 commented 10 months ago

参考文献
https://github.com/omniauth/omniauth#getting-started

[現在試したこと] config/initializers/devise.rbからgithub認証を行う方法だと、このような呼ばれ方をする

  config.omniauth :github, ENV['GITHUB_ID'], ENV['GITHUB_SECRET']
  def self.omniauth(provider, *args)
    config = Devise::OmniAuth::Config.new(provider, args)
    @@omniauth_configs[config.strategy_name.to_sym] = config
  end

そして、READMEにも書かれている一般的な config/initializers/omniauth.rbを使うやり方だと、このようなフローになる

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :github, ENV['GITHUB_ID'], ENV['GITHUB_SECRET']
end
module OmniAuth
  class Builder < ::Rack::Builder
   def provider(klass, *args, **opts, &block)
      if klass.is_a?(Class)
        middleware = klass
      else
        begin
          middleware = OmniAuth::Strategies.const_get(OmniAuth::Utils.camelize(klass.to_s).to_s, false)
        rescue NameError
          raise(LoadError.new("Could not find matching strategy for #{klass.inspect}. You may need to install an additional gem (such as omniauth-#{klass})."))
        end
      end

      use middleware, *args, **options.merge(opts), &block
    end

問い合わせ中だが、これで解決できるかも