🙆

OmniAuthの/auth/:providerを通して、GitHubの認証認可画面へ遷移しないときの対処法

2024/07/06に公開

パーフェクト Ruby on Railsの第6章「Railsアプリケーション開発」において、OmniAuthを使って、OAuthを利用したログインを試しました。

https://gihyo.jp/book/2020/978-4-297-11462-6

その際、GitHubの認証認可画面へ遷移しなかったため、その対処法について記載します。

書籍の6-1から6-3-2までの手順は完了済みとします。

実装

書籍の6-3-3にて、GitHubアカウントでログインする機能の作成を行います。

Gemfile

...
gem 'omniauth'
gem 'omniauth-github'
gem 'omniauth-rails_csrf_protection'
...

config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
    if Rails.env.development? || Rails.env.test?
        provider :github, "YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET"
    else
        provider :github,
          Rails.application.credentials.github[:client_id],
          Rails.application.credentials.github[:client_secret]
    end
end

app/views/layouts/application.html.haml

...
  %body
    %header.navbar.navbar-expand-sm.navbar-light.bg-light
      .container
        = link_to "AwesomeEvents", root_path, class: "navbar-brand mr-auto"
        %ui.navbar-nav
          %li.nav-item
            = link_to "GitHubでログイン", "/auth/github", class: "nav-link", method: :post
    .container
      - if flash.notice
        .alert.alert-success
          = flash.notice
      = yield

また、この時点で、6-3-4のユーザモデルの作成まで完了済みです。

対処

Rails Server起動

bin/rails s
=> Booting Puma
=> Rails 7.1.3.4 application starting in development 
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 6.4.2 (ruby 3.2.2-p53) ("The Eagle of Durango")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 56744
* Listening on http://127.0.0.1:3000
* Listening on http://[::1]:3000
Use Ctrl-C to stop

その後、http://127.0.0.1:3000へアクセスし、「GitHubでログイン」を押下すると、Routing Error No route matches [GET] "/auth/github"となる。

対処として、config/initializers/omniauth.rbOmniAuth.config.allowed_request_methods = [:post, :get]を追加すると、遷移するようになりました。

書籍にもある通り、GitHubを唯一の認証方法として使用している場合、CSRFは脅威ではないため、config/initializers/omniauth.rbに次の行を追加することで、GETメソッドを安全に有効にすることができます。

OmniAuth.config.allowed_request_methods = [:post, :get]

Rails.application.config.middleware.use OmniAuth::Builder do
    if Rails.env.development? || Rails.env.test?
        provider :github, "YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET"
    else
        provider :github,
          Rails.application.credentials.github[:client_id],
          Rails.application.credentials.github[:client_secret]
    end
end

参考

https://stackoverflow.com/questions/65995219/omniauth-isnt-catching-the-initial-get-auth-provider-request

GitHubで編集を提案

Discussion