Я пытаюсь следовать Simple OmniAuth Railscast 241, и он работает нормально, если у меня нет Route Globbing. в конце /config/routes.rb:

match '*uri' => "posts#index"

Если я запрашиваю /auth/twitter с подстановкой, OmniAuth ничего не делает:

Started GET "/auth/twitter" for 127.0.0.1 at 2011-04-03 19:17:44 +0200
  Processing by PostsController#index as HTML
  Parameters: {"uri"=>"auth/twitter"}
Rendered posts/index.html.haml within layouts/application (9.0ms)
Completed 200 OK in 103ms (Views: 14.6ms | ActiveRecord: 0.7ms)

Без маршрута подстановки он аутентифицируется правильно.

Есть ли способ использовать и подстановку маршрутов, и OmniAuth?

7
Andrei 3 Апр 2011 в 21:38

2 ответа

Лучший ответ

Процесс OmniAuth заключается в обеспечении следующих функций при вызове URL /auth/:provider:

  1. Передайте запрос в базовое приложение Rack / Rails, как если бы OmniAuth там не было;
  2. Определите, генерировало ли базовое приложение сообщение 404;
  3. Если это так, вызовите фактическую функциональность OmniAuth.

Поскольку вы, по сути, сопоставляете все с помощью подстановки маршрутов, ваше приложение никогда не будет выдавать 404, а OmniAuth не сможет этого сделать. Я вижу два немедленных варианта.

Сопоставление маршрутов OmniAuth с 404 вручную

Добавьте новый маршрут следующим образом:

match '/auth/:provider' => 'omniauth#passthru'

Затем создайте контроллер и действие, которое генерирует 404:

class OmniauthController < ApplicationController
  def passthru
    render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
  end
end

Определите статус 404 в Glob Route

Я предполагаю, что ваш глобальный маршрут будет искать сообщение, каким-то образом совпадающее с URL-адресом; вы можете принять промахи (например, когда PostsController#index не может найти сообщение) и затем сгенерировать 404.

class PostsController < ApplicationController
  def index
    if @posts = Post.find_by_current_url_or_whatever
      render 'index'
    else
      render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
    end
  end
end
17
Michelle Tilley 4 Апр 2011 в 06:37
Благодарность! Теперь я понимаю, как это работает. Я установил маршруты, как вы предлагаете, с небольшими изменениями. Не могли бы вы их прокомментировать (см. Мой ответ), если я делаю это неправильно?
 – 
Andrei
4 Апр 2011 в 12:31

Слегка измененное предложение Брэндона Тилли:

# config/routes.rb
match '/auth/:provider/callback' => 'sessions#create'
match 'auth/*rest' => 'application#omniauth'
match '*uri' => 'posts#index'

# app/controllers/application_controller.rb
def omniauth
  render text: 'Authentication', status: 404
end
0
Community 23 Май 2017 в 14:45
4
Не забывайте, что OmniAuth использует другие маршруты, такие как /auth/failure, для обозначения неудачной аутентификации (например, пользователь отклонил разрешения на Facebook и т. Д.). Используя эти маршруты, этот URL будет съеден application#omniauth.
 – 
Michelle Tilley
4 Апр 2011 в 19:42