Ошибка маршрутизации OmniAuth, отсутствие соответствия маршрута
Я работаю над Ryan Bates railscast # 235 OmniAuth Part 1, используя драгоценный камень OmniAuth, чтобы пользователи могли войти в мое веб-приложение, используя 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 на -07: 36.
Что может быть возможным решением этой проблемы? Будет ли проблема с route.rb? или omniauth.rb?
Наш omniauth.rb выглядит следующим образом:
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, 'OURCONSUMERKEY', 'OURCONSUMERSECRET'
provider :twitter, 'OURCONSUMERKEY', 'OURCONSUMERSECRET'
end
Ответы
Ответ 1
Вам нужно прокомментировать ": omniauthable" в вашей модели, используемой драгоценным камнем Devise (обычно это модель "Пользователь" = файл user.rb):
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable, :recoverable,
:rememberable, :trackable, :validatable # plus whatever other calls...
# :omniauthable
[...]
end
Использование вызова ": omniauthable" означает загрузку компонентов разработки /omniauth (которые вызывают конфликты с установкой omniauth).
Ответ 2
fyi, если вы столкнулись с этой проблемой, и вы комбинируете Devise 2.1.x с OmniAuth 1.x и OAuth2, имейте в виду, что сейчас лучше использовать /users/auth/facebook
(то есть каталог в ваших контроллерах "users/
')...
Соответственно, вам нужно нажать /users/auth/facebook
, хотя почти все учебники, примеры и руководства там для OmniAuth говорят, чтобы нажать /auth/facebook
! Это (в сочетании с тем фактом, что Facebook не будет обновлять мой URL-адрес сайта до тех пор, пока я не добавлю порт # :3000
, не сохраню, не размножу и не удалю его, а затем удалю его снова) заставил меня замочить в течение определенного периода времени, который останется невыразимым, чтобы защитить огорченные.: -)
Кроме того, в отличие от ответа с большинством голосов прямо сейчас - это, конечно, решает проблему, но не позволяет вам интегрироваться с Devise - я didn 't нужно удалить :omniauthable
из Devise (как только я набрал правильный URL). Это только "вызывает конфликты" для меня, когда я использовал неправильный URL.
EDIT: Кроме того, в отличие от исходного вопроса, с Devise 2.1.x и OmniAuth 1.x, насколько мне известно, не нужно создавать инициализатор с именем omniauth.rb
для Rack - with Devise, вы просто добавляете свои биты OmniAuth в config/initializers/devise.rb
(но не на 100% уверены в этом). См. plataformatec/devome Обзор OmniAuth в разделе Facebook вверху, для более подробной информации.
Ответ 3
Собственно, omniauth заботится об определении маршрутов для твиттера.
Таким образом, добавление этого кода происходит только для обратного вызова
match "/auth/twitter/callback" => "sessions#create"
match "/signout" => "sessions#destroy", :as => :signout
Попробуйте перезагрузить сервер: rails server
Ответ 4
Указание URL-адреса обратного вызова для приложения Twitter должно разрешить это.
Ответ 5
Я видел ту же проблему при использовании omniauth 1.1.3 в Rails 2.3.16. Он отлично работал при разработке под управлением 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 продолжал работать нормально в режиме разработки.
Ответ 6
SB, могу ли я сделать предложение? Сначала просмотрите эпизод № 241. Это более простой эпизод. Я склонен думать, что ваша проблема НЕ с route.rb. Я использую OmniAuth для аутентификации пользователей и отправки твитов от имени моих пользователей, и единственные пути, которые у меня есть для этой части:
match "/auth/twitter/callback" => "sessions#create"
match "/signout" => "sessions#destroy", :as => :signout
Ответ 7
match '/auth/:provider/callback' => 'sessions#auth_callback', :as => :auth_callback
он работает в моем проекте, вы можете попробовать как это
Ответ 8
У меня была такая же проблема. Часть, которую я отсутствовала, заключалась в следующем:
gem 'devise'
Когда я запустил bundle install
и обновил страницу, он был исправлен.
Ответ 9
Обязательно добавьте 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
Ответ 10
Добавьте gem 'omniauth-twitter'
в свой Gemfile, запустите bundle
и перезапустите веб-сервер. До Rails 4.0 я считаю, что вам нужно добавить строку gem в группу :assets
.