Omniauth 没有捕捉到最初的 get "/auth/:provider" 请求

Omniauth isn't catching the initial get "/auth/:provider" request

逐字遵循设置文档

在 gemfile 中

gem 'omniauth'
gem 'omniauthgithub'
gem 'dotenv-rails'

在config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :github, ENV['GITHUB_CLIENT_ID'], ENV['GITHUB_CLIENT_SECRET']
end

而用户link

<%= link_to "Log in with GitHub!", "/auth/github" %>

回调路由也设置好了

get '/auth/:provider/callback' => 'sessions#create'

但它并没有走到那一步。当我点击 link 时,立即出现路由错误

没有路由匹配[GET]“/auth/github”

我能找到的一切都表明初始“/auth/:provider”请求被 Omniauth 黑盒魔法拦截,我所要做的就是配置回调路由。我也在 Facebook 上尝试了整个设置,只是想看看它是否是 Github 特定的东西,但没有成功。我擦除 Gemfile.lock 并重新 运行 捆绑安装只是为了确保这些 gems 都处于工作状态,但这并没有改变任何东西。我在文章中发现的所有其他 omniauth 问题都是关于回调路由,而不是初始 get 请求——这让我相信它要么非常明显,要么非常模糊。请帮忙!

我今天一直在努力解决完全相同的问题(除了我正在整合 google_oauth2 而不是 github),最终对我有用的包括以下 the recently updated instructions from the Devise wiki.

具体来说,关于确保使用 POST 请求的部分:

OmniAuth 2.0+ requires using HTTP POST as the request method to initiate the authentication, so your link should be configured with method: :post: (this requires rails-ujs or similar to create POST requests)

所以一旦我改变了我的观点,使用 button_to 而不是 link_to(或者我可以使用 link_tomethod: :post),我就让它工作了。

另外,你也在用Devise吗?如果是这样,请确保遵循与设计相关的设置说明(具体来说,删除 config/intializers/omniauth.rb 并将您的设置凭据放入 config/initializers/devise.rb 中,如上述 wiki post ...否则它显然会以一种非常安静的方式发生冲突,这可以成为一个“非常有趣”的调试 sesh)

正如@obiruby 所说,这是因为 OmniAuth 2.0+ 中默认启用了新的 CSRF 保护。

如果您使用 GitHub 作为唯一的身份验证方法,CSRF 不是威胁,因此您可以通过将以下行添加到 config/initializers/omniauth 来安全地重新启用 GET 方法.rb:

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