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

时间:2012-02-05 21:55:09

标签: ruby-on-rails omniauth

我正在通过Ryan Bates railscast#235 OmniAuth第1部分,使用OmniAuth gem允许用户使用Twitter或Facebook以及更高版本的Google Apps登录我的网络应用。

现在我遇到了这个错误

Routing Error

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

我已正确设置routes.rb文件以处理auth回调提供程序匹配,如下所示:

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

当我链接到localhost:3000 / auth / twitter时,我收到此错误。贝茨在他的Railscast-at -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

11 个答案:

答案 0 :(得分:16)

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

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

  [...]

end

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

答案 1 :(得分:10)

fyi,如果你遇到这个问题并且你正在将Devise 2.1.x与OmniAuth 1.x和OAuth2结合起来,请注意现在的最佳做法是使用/users/auth/facebook(即,你的控制器叫'users/')......

因此,您需要点击/users/auth/facebook,尽管OmniAuth的几乎所有教程,示例和指南都说/auth/facebook!这(结合Facebook不会更新我的网站URL,直到我添加端口#:3000,保存,传播并点击它,然后再将其删除)这一事实让我难倒了一段时间将保持无尽,以保护懊恼。 : - )

此外,与answer with most votes right now不同 - 它当然解决了问题,但不允许您与Devise集成 - 我不需要从Devise中移除:omniauthable(一旦我正在点击正确的URL)。当我使用错误的URL时,它只会“引起冲突”。

编辑:另外,与原始问题不同,使用Devise 2.1.x和OmniAuth 1.x,据我所知,不需要为Rack创建一个omniauth.rb命名初始化程序 - 设计,你只需将你的OmniAuth位添加到config/initializers/devise.rb(但不是100%确定这一点)。有关更多详细信息,请参阅顶部 Facebook示例部分下的plataformatec/devise's OmniAuth Overview

答案 2 :(得分:4)

实际上,omniauth负责为twitter定义路线。

因此,添加此代码仅适用于回调

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

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

答案 3 :(得分:1)

Twitter上指定应用的回调网址应解决此问题。

答案 4 :(得分: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在开发模式下继续正常工作。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

match '/auth/:provider/callback' => 'sessions#auth_callback', :as => :auth_callback

它适用于我的项目,您可以尝试这样的

答案 7 :(得分:0)

我有同样的问题。我遗漏的部分是将以下内容放入Gem文件

gem 'devise'

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

答案 8 :(得分:0)

请务必在 config / initializers / *

中添加“ 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

答案 9 :(得分:0)

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

答案 10 :(得分: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;
  }

将旧版本的 omniauth 添加到您的 Gemfile

#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