我正在通过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
答案 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时,它只会“引起冲突”。
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)
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")