Ruby on rails OmniAuth路由错误,没有路由匹配

Ruby on rails OmniAuth路由错误,没有路由匹配,ruby-on-rails,omniauth,Ruby On Rails,Omniauth,我正在通过Ryan Bates railscast#235 OmniAuth第1部分工作,使用OmniAuth gem允许用户使用Twitter或Facebook以及更高版本的谷歌应用程序登录我的web应用程序 现在我遇到了这个错误 Routing Error No route matches [GET] "/auth/twitter" 我已正确设置了routes.rb文件以处理身份验证回调提供程序匹配,如下所示: match "/auth/:provider/callback" =&g

我正在通过Ryan Bates railscast#235 OmniAuth第1部分工作,使用OmniAuth gem允许用户使用Twitter或Facebook以及更高版本的谷歌应用程序登录我的web应用程序

现在我遇到了这个错误

Routing Error

No route matches [GET] "/auth/twitter"
我已正确设置了routes.rb文件以处理身份验证回调提供程序匹配,如下所示:

  match "/auth/:provider/callback" => "authentications#create"
当我链接到localhost:3000/auth/twitter时,我得到了这个错误。在-07:36,贝茨坐在他的火车上

这个问题的可能解决方案是什么?routes.rb会有问题吗?还是omniauth.rb

我们的omniauth.rb如下所示:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, 'OURCONSUMERKEY', 'OURCONSUMERSECRET'
  provider :twitter,  'OURCONSUMERKEY', 'OURCONSUMERSECRET'
end

某人,我可以提个建议吗?先看第241集。这是一个简单的插曲。我倾向于认为你的问题不在于routes.rb。我正在使用OmniAuth对用户进行身份验证,并代表我的用户发送推文,我在这方面的唯一路线是:

 match "/auth/twitter/callback" => "sessions#create"
 match "/signout" => "sessions#destroy", :as => :signout

它在我的项目中起作用,你可以像这样尝试一下。实际上,omniauth负责为twitter定义路由

OmniAuth.config.logger = Rails.logger 

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET
end
因此,添加此代码仅用于回调

match "/auth/twitter/callback" => "sessions#create"
match "/signout" => "sessions#destroy", :as => :signout


尝试重新启动服务器:
rails服务器

在上指定应用程序的回调URL可以解决此问题。

您需要在Desive gem使用的模型中注释掉“:omniauthable”(通常是模型“User”=User.rb文件):

class用户

使用“:omniauthable”调用意味着加载designe/omniauth组件(这会与您的omniauth设置发生冲突)。

仅供参考,如果您遇到此问题,并且要将designe 2.1.x与omniauth 1.x和OAuth2相结合,请注意,现在的最佳做法是使用
/users/auth/facebook
(即,控制器中名为“
users/
”的目录)

因此,您需要点击
/users/auth/facebook
,尽管OmniAuth的几乎所有教程、示例和指南都说要点击
/auth/facebook
!这(再加上Facebook在我添加端口#
:3000
、保存、传播并点击它,然后再次删除它之前不会更新我的网站URL,这让我难堪了一段时间,为了保护懊恼的人,这段时间将不为人知。:-)

此外,与-当然解决了问题,但不允许您与Deviate集成-不同的是,我不需要从Deviate中删除
:omniauthable
(一旦我找到了正确的URL)。它只会在我使用错误的URL时“导致冲突”


编辑:另外,与原来的问题不同,就我所知,DeVICE 2.1.x和OmniAuth 1.x不需要为Rack创建一个名为
OmniAuth.rb
的初始化器——使用DeVICE,您只需将OmniAuth位添加到
config/initializers/DeVICE.rb
(但不是100%确定)。有关更多详细信息,请参见顶部的Facebook示例部分。

我也有同样的问题。我缺少的部分是将以下内容放入Gem文件中

gem 'devise'

当我运行
bundle install
并刷新页面时,它被修复了。

在Rails 2.3.16上使用omniauth 1.1.3时,我也看到了同样的问题。在webrick下运行时,它在开发中运行良好,但在Fastcgi下的生产中运行时,omniauth提供程序无法检测到任何路由

问题是fastcgi代码没有正确地填充PATH_INFO环境变量,而omniauth则依赖于此

解决方案是添加另一个中间件来修复路径信息。我使用了以下方法:

class Rack::PathInfoRewriter
  def initialize(app)
    @app = app
  end

  def call(env)
    env.delete('SCRIPT_NAME')
    parts = env['REQUEST_URI'].split('?')
    env['PATH_INFO'] ||= parts[0]
    env['QUERY_STRING'] ||= parts[1].to_s
    @app.call(env)
  end
end

请注意| |=这是必要的,以便webrick在开发模式下继续正常工作。

确保在配置/初始化器中添加您的“omniauth.rb

我的config/initializers/omniauth.rb如下所示

OmniAuth.config.logger = Rails.logger 

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET
end

gem'omniauth twitter'
添加到您的gem文件中,重新运行
bundle
,然后重新启动您的web服务器。在Rails 4.0之前,我相信您必须将gem行添加到
:assets
组中。

以下是我解决此问题的方法:

如果您从Nginx代理:

location @rails {
    proxy_set_header Host $http_host;
    proxy_set_header Client-IP $remote_addr;
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass http://rails_app;
  }
将旧版本的omniauth添加到您的GEM文件中

#auth
gem 'omniauth-facebook', '~> 8.0'
gem 'omniauth', '~> 1.9.1' #this is important
设置强制SSL

config.force_ssl = ENV['CLIENT_URL'].include?("https")

相关答案

我的一些新应用程序也存在类似问题……我已经按照步骤进行了操作,过去成功地完成了这项操作,但现在没有路径匹配错误:/i我也有同样的问题。你找到解决方案了吗?@picardo已经有五个多月没有碰到过这个问题了,但是按照下面的建议指定Twitter回调应该可以解决问题苏。这可能是解决办法,也是我的问题。这应该是答案,但在某些情况下不是。我希望这会奏效,但我仍然拥有它
config.force_ssl = ENV['CLIENT_URL'].include?("https")