Sinatra Warden с существующим приложением Ruby on Rails, которое использует Devise - PullRequest
5 голосов
/ 18 апреля 2011

Я пытаюсь разделить мое текущее веб-приложение на Ruby on Rails 3 и его веб-сервисы (API).Мое веб-приложение работает на Heroku и реализует API как маршрут с пространством имен в моем приложении.Например, /events возвращает страницу HTML, а /api/v1/events возвращает данные JSON.

В соответствии с некоторыми рекомендациями , я хочу разделить их на два разных приложения.Я выбрал Sinatra для реализации приложения API.Теперь он работает для простых запросов, где аутентификация не требуется.

My Ruby on Rails 3 приложение использует Devise для аутентификации пользователей.Также есть возможность авторизоваться на Facebook.Теперь я хочу добиться базовой HTTP-аутентификации пользователей (включая регистрацию) через мой API на основе Sinatra с помощью Warden.

Каков наилучший способ сделать это?Или, может быть, я могу использовать что-то другое, чем Warden?

Имейте в виду, что я не очень знаком с Rack:)

1 Ответ

10 голосов
/ 02 ноября 2011

Я смог заставить его работать.Было несколько основных аспектов:

  • Get Devise, работающий с Rails (Devise - приложение Rails, без него работать не будет)
  • Настройка отображения (маршрута) на уровне стойкидля поддержки Rails и Sinatra
  • Совместное использование сеансов между Rails и Sinatra
  • Setup Warden и предоставление его Sinatra

Вот наиболее важная часть кода/config.ru:

    #

    # ...

    # Rest with Rails
    map "/" do
      run MyApp::Application
    end

    # Anything urls starting with /slim will go to Sinatra
    map "/slim" do

      # make sure :key and :secret be in-sync with initializers/secret_store.rb initializers/secret_token.rb
      use Rack::Session::Cookie, :key => '<< see, initializers/secret_store.rb >>', :secret => '<< copy from initializers/secret_token.rb >>'

      # Point Warden to the Sinatra App
      use Warden::Manager do |manager|
        manager.failure_app = AppMain
        manager.default_scope = Devise.default_scope
      end

      # Borrowed from https://gist.github.com/217362
      Warden::Manager.before_failure do |env, opts|
        env['REQUEST_METHOD'] = "POST"
      end

      run AppMain
    end

См. http://labnote.beedesk.com/sinatra-warden-rails-devise для полного решения.

...