2011-04-18 13 views
6

Estoy tratando de dividir mi aplicación web Ruby on Rails 3 actual y sus servicios web (API). Mi aplicación web se ejecuta en Heroku e implementa API como una ruta de espacio de nombres dentro de mi aplicación. Por ejemplo, /events devuelve una página HTML y /api/v1/events devuelve datos JSON.Sinatra Warden con la aplicación Ruby on Rails existente que usa Devise

Según algunos best practices, quiero dividirlos en dos aplicaciones diferentes. He elegido Sinatra para implementar la aplicación API. Funciona ahora para solicitudes simples donde no se requiere autenticación.

La aplicación My Ruby on Rails 3 está utilizando Devise para autenticar usuarios. También hay posibilidad de iniciar sesión con una cuenta de Facebook. Ahora lo que quiero lograr es la Autenticación Básica HTTP de los usuarios (incluido el registro) a través de mi API basada en Sinatra usando Warden.

¿Cuál es la mejor manera de hacerlo? ¿O quizás pueda usar algo diferente que Warden?

Tenga en cuenta que no estoy muy familiarizado con el estante :)

+0

Mi preferencia personal es la subclase ActionController :: Metal http://apidock.com/rails/ActionController/Metal. Lo más probable es que tenga una aplicación más rápida y consistente usando este enfoque, en lugar de mezclar marcos. Sinatra no tiene ningún beneficio en absoluto en su escenario. – Roman

+0

@Roman qué marco si alguno recomendaría? Creo que Rails es pesado para este tipo de trabajo. – Ivan

+0

Como dije, la característica de los rieles a menudo se pasa por alto, que ofrece un muy buen rendimiento con una sobrecarga mínima. Básicamente es un módulo de rack que puede aprovechar el enrutador de los rieles. – Roman

Respuesta

9

yo era capaz de conseguir que funcione. Había unos pocos aspectos principales:

  • Obtener Diseñar trabajar con Rails (Diseñar es una aplicación Rails, no va a funcionar sin ella)
  • instalación de la aplicación (ruta) en el nivel de bastidor para soportar ambos rieles y Sinatra
  • Compartir las sesiones entre los carriles y Sinatra
  • Configuración Warden y ponerlo a disposición de Sinatra

He aquí parte más relevante del código de /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 

See, http://labnote.beedesk.com/sinatra-warden-rails-devise para una solución completa.

Cuestiones relacionadas