🙆
OmniAuthの/auth/:providerを通して、GitHubの認証認可画面へ遷移しないときの対処法
パーフェクト Ruby on Railsの第6章「Railsアプリケーション開発」において、OmniAuthを使って、OAuthを利用したログインを試しました。
その際、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.rb
にOmniAuth.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
参考
Discussion