Ошибка маршрутизации OmniAuth, нет соответствия маршрута - PullRequest
13 голосов
/ 06 февраля 2012

Я работаю через Ryan Bates railscast # 235 OmniAuth, часть 1, используя гем OmniAuth, чтобы пользователи могли входить в мое веб-приложение через Twitter или Facebook и более поздние версии Google Apps.

Прямо сейчас я сталкиваюсь с этой ошибкой

Routing Error

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

Я правильно настроил свой файл route.rb для обработки совпадения с поставщиком аутентификации обратного вызова следующим образом:

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

Когда я ссылаюсь на localhost: 3000 / auth / twitter, я получаю эту ошибку. где, как Бейтс в своем Railscast в -07: 36.

Что может быть возможным решением этой проблемы? Будет ли это проблема с rout.rb? или omniauth.rb?

Наш omniauth.rb выглядит так:

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

Ответы [ 10 ]

16 голосов
/ 10 мая 2012

Вам необходимо закомментировать ': omniauthable' в вашей модели, используемой гемом Devise (обычно это модель '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).

10 голосов
/ 12 октября 2012

Кстати, если вы сталкиваетесь с этой проблемой и комбинируете Devise 2.1.x с OmniAuth 1.x и OAuth2, помните, что в настоящее время рекомендуется использовать /users/auth/facebook (то есть каталог в ваших контроллерахsaid, 'users/') ...

Соответственно, вам нужно нажать /users/auth/facebook, хотя почти все учебные пособия, примеры и руководства для OmniAuth говорят, что нужно нажать /auth/facebook!Это (в сочетании с тем фактом, что Facebook не будет обновлять URL моего сайта до тех пор, пока я не добавлю порт # :3000, не сохраню, не распространю и не ударую его, а затем снова не смог его удалить), поставило меня в тупик на время, которое останется невысказанным., чтобы защитить огорченных.: -)

Кроме того, в отличие от ответа с большинством голосов прямо сейчас - который, конечно, решает проблему, но не позволяет интегрироваться с Devise - я этого не делалнеобходимо удалить :omniauthable из Devise (как только я нажал правильный URL).Это только «вызывает конфликты» для меня, когда я использовал неправильный URL.

РЕДАКТИРОВАТЬ: Кроме того, в отличие от исходного вопроса, с Devise 2.1.x и OmniAuth 1.x, насколько я знаю, одинне нужно создавать инициализатор omniauth.rb для Rack - с Devise вы просто добавляете свои биты OmniAuth в config/initializers/devise.rb (но не уверены на 100% в этом).См. plataformatec / devise Обзор OmniAuth в разделе пример Facebook в верхней части, для более подробной информации.

4 голосов
/ 09 апреля 2012

На самом деле, omniauth заботится об определении маршрутов для твиттера.

Таким образом, добавление этого кода только для обратного вызова

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

Попробуйте перезапустить сервер: rails server

1 голос
/ 19 марта 2013

Я видел ту же проблему при использовании 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

Обратите внимание, что || = было необходимо, чтобы вебрик продолжал нормально работать в режиме разработки.

1 голос
/ 19 апреля 2012

Указание URL обратного вызова для приложения на Twitter должно решить эту проблему.

0 голосов
/ 20 декабря 2013

Добавьте gem 'omniauth-twitter' в ваш Gemfile, перезапустите bundle и перезапустите веб-сервер. До Rails 4.0 я думаю, что вам нужно добавить строку гема в группу :assets.

0 голосов
/ 24 сентября 2013

Обязательно добавьте свой 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
0 голосов
/ 07 января 2013

У меня была такая же проблема. Часть, которую я пропустил, помещала следующее в Gem File

gem 'devise'

Когда я запустил bundle install и обновил страницу, она была исправлена.

0 голосов
/ 06 февраля 2012
match '/auth/:provider/callback' => 'sessions#auth_callback', :as => :auth_callback

это работает в моем проекте, вы можете попробовать вот так

0 голосов
/ 06 февраля 2012

СБ, могу я сделать предложение? Сначала посмотрите эпизод # 241. Это более простой эпизод. Я склонен думать, что твоя проблема не в маршрутах. Я использую OmniAuth для аутентификации пользователей и отправки твитов от имени моих пользователей, и единственные маршруты, которые у меня есть для этой части:

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