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

问题描述

逐字遵循设置文档

在 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_to "Log in with GitHub!","/auth/github" %>

回调路由也设置好了

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

但它并没有那么远。当我点击链接时,立即出现路由错误

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

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

解决方法

今天我一直在为完全相同的问题苦苦挣扎(除了我正在集成 google_oauth2 而不是 github),最终对我有用的包括以下 the recently updated instructions from the Devise wiki

特别是关于确保使用 POST 请求的部分:

OmniAuth 2.0+ 需要使用 HTTP POST 作为请求方法来启动 身份验证,因此您的链接应该使用方法配置::post:(这个 需要 rails-ujs 或类似工具来创建 POST 请求)

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

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

,

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

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

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