Подтвердить что ты не робот

Ошибка маршрутизации 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
4b9b3361

Ответ 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.