Я пытаюсь следовать 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?
2 ответа
Процесс OmniAuth заключается в обеспечении следующих функций при вызове URL /auth/:provider
:
- Передайте запрос в базовое приложение Rack / Rails, как если бы OmniAuth там не было;
- Определите, генерировало ли базовое приложение сообщение 404;
- Если это так, вызовите фактическую функциональность 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
Слегка измененное предложение Брэндона Тилли:
# 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
/auth/failure
, для обозначения неудачной аутентификации (например, пользователь отклонил разрешения на Facebook и т. Д.). Используя эти маршруты, этот URL будет съеден application#omniauth
.
Похожие вопросы
Связанные вопросы
Новые вопросы
ruby-on-rails
Ruby on Rails - это полнофункциональная платформа веб-приложений с открытым исходным кодом, написанная на Ruby. Он следует популярной модели фреймворка MVC и известен своим подходом «соглашение поверх конфигурации» при разработке приложений.