问题描述
逐字遵循设置文档
在 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_to
与 method: :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]