OmniAuth路由错误,没有匹配的路由

15

我正在学习Ryan Bates的railscast #235 OmniAuth Part 1,使用OmniAuth gem允许用户使用Twitter或Facebook以及后来的Google Apps登录到我的Web应用程序。

目前我遇到了这个错误。

Routing Error

No route matches [GET] "/auth/twitter"

我已经正确设置了我的routes.rb文件,以处理auth回调提供程序匹配,代码如下:

  match "/auth/:provider/callback" => "authentications#create"

当我链接到localhost:3000/auth/twitter时,我会得到这个错误。而Bates在他的Railscast中是没有出现这个问题的。

可能的解决方案是什么?这是routes.rb或omniauth.rb的问题吗?

我们的omniauth.rb看起来像这样:

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

我遇到了几个新应用程序的类似问题...我已经按照步骤并在过去成功地执行过这些步骤,但现在却只得到“没有路由匹配”的错误 :/ - Danny
@picardo 五个月没碰这个了,但按照下面建议的指定Twitter回调应该可以解决问题。 - scud bomb
11个回答

18

您需要注释掉由Devise gem使用的模型中的“:omniauthable”(通常是“用户”= user.rb文件中的模型):

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :recoverable,
         :rememberable, :trackable, :validatable # plus whatever other calls...
       # :omniauthable

  [...]

end

使用':omniauthable'调用意味着加载devise/omniauth组件(这会与您的omniauth设置冲突)。


这可能是解决方案,也是我的问题。 - Puce

10

提醒一下,如果你遇到这个问题并且在结合Devise 2.1.x和OmniAuth 1.x以及OAuth2时,请注意最佳实践现在是使用/users/auth/facebook(也就是,在你的控制器中称为“users/”的目录)...

因此,您需要访问/users/auth/facebook,即使几乎所有关于OmniAuth的教程、示例和指南都说要访问/auth/facebook!这个问题和Facebook直到我添加了端口号:3000才能更新我的站点URL(保存、传播并访问它,然后再将其删除),这使我陷入了一个不可言说的时间困境,以保护那些羞愧的人。:-)

此外,与当前得票最高的答案不同的是,它当然解决了问题,但不允许您与Devise集成,而我不需要从Devise中删除:omniauthable(一旦我访问了正确的URL)。只有在我使用错误的URL时,它才会“引起冲突”。

编辑:此外,与原问题不同的是,在使用Devise 2.1.x和OmniAuth 1.x时,据我所知,您不需要为Rack创建名为omniauth.rb的初始化程序--使用Devise,您只需将您的OmniAuth代码添加到config/initializers/devise.rb中(但对此并不100%确定)。请参见plataformatec/devise的OmniAuth概述顶部的Facebook示例部分,以获取更多详细信息。


1
这是答案 - Jude Calimbas

4
实际上,Omniauth 会负责定义 Twitter 的路由。
因此,添加这段代码只是为了回调。
match "/auth/twitter/callback" => "sessions#create"
match "/signout" => "sessions#destroy", :as => :signout

尝试重新启动您的服务器:rails server

它应该这样做,但在某些情况下它并没有。 - Zia Ul Rehman Mughal

1
我曾在Rails 2.3.16中使用omniauth 1.1.3时遇到相同的问题。在webrick下运行时,开发环境没有问题,但在Fastcgi下运行生产环境时,omniauth提供程序无法检测到任何路由。
问题在于fastcgi代码未正确填充PATH_INFO环境变量,而omniauth依赖该变量。
解决方法是添加另一个中间件来修复PATH_INFO。我使用了以下代码:
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能够正常工作。

我希望这会起作用,但我仍然有它。 - Tim Kozak

1

Twitter上为应用程序指定回调URL应该解决此问题。


0

这是我解决这个问题的方法:

如果你正在使用 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;
  }

在你的Gemfile中添加一个旧版本的omniauth

#auth
gem 'omniauth-facebook', '~> 8.0'
gem 'omniauth', '~> 1.9.1' #this is important

设置强制SSL

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

相关答案 https://stackoverflow.com/a/66651142/788798


0

请务必将您的 'omniauth.rb' 添加到 config/initializers/*

我的 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

0
gem 'omniauth-twitter'添加到您的Gemfile中,重新运行bundle并重启您的Web服务器。在Rails 4.0之前,我相信您必须将宝石行添加到:assets组中。

0

我也遇到了同样的问题。我忘记在Gem文件中添加以下内容了

gem 'devise'

当我运行了bundle install并刷新页面后,问题得到了解决。


0

SB,我可以提个建议吗?先看一下第241集。那是一个更简单的集数。我倾向于认为你的问题不在routes.rb文件中。我正在使用OmniAuth来验证用户并代表我的用户发送推文,而我所拥有的路由只有:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接