2012-03-02 12 views
7

Relacionados: Rails 3 SSL routing redirects from https to http (lamentablemente no funcionó).¿cómo debo hacer para que todas las rutas de Devise usen https?

duplicado, pero la respuesta no funcionó para mí: setting up ssl on devise

Tengo una aplicación web que ha estado trabajando bien durante un tiempo, pero ahora tengo que añadir SSL para las rutas de entrada/editar acct. Estoy usando Devise para la autenticación. Encontré una entrada en la wiki de diseño que hizo que el proceso pareciera bastante simple, pero maldita sea si puedo hacer que funcione. La parte sencilla era la siguiente:

#in config/environments/production.rb 
config.to_prepare { Devise::SessionsController.force_ssl } 
config.to_prepare { Devise::RegistrationsController.force_ssl } 

Y luego hay cerca de 25 líneas de código en este GIST: https://gist.github.com/1040964

que obtuve que trabajar bastante bien, pero cuando cada vez que cierre la sesión me sale un 301 de la sesiones DELETE acción que me envía a un GET.

Started DELETE "https://stackoverflow.com/users/sign_out" for 98.246.164.160 at 2012-03-02 01:45:42 +0000 
[02 Mar 01:45 10886 INFO] Processing by Devise::SessionsController#destroy as HTML 
[02 Mar 01:45 10886 INFO] Parameters: {"authenticity_token"=>"fI4VZ4V0Go2Civo3sJz8Dv5/Wtaa90ynaYr+xxx="} 
[02 Mar 01:45 10886 DEBUG] Parameters: {"_method"=>"delete", "authenticity_token"=>"fI4VZ4V0Go2Civo3sJz8Dv5/Wtaa90ynaYr+xxxx=", "action"=>"destroy", "controller"=>"devise/sessions"} 
[02 Mar 01:45 10886 INFO] Redirected to https://ec2-xx-xx-106-255.us-west-2.compute.amazonaws.com/users/sign_out 
[02 Mar 01:45 10886 INFO] Completed 301 Moved Permanently in 3ms 

Started GET "https://stackoverflow.com/users/sign_out" for xx.xx.164.160 at 2012-03-02 01:45:42 +0000 
[02 Mar 01:45 10886 FATAL] 
ActionController::RoutingError (No route matches [GET] "https://stackoverflow.com/users/sign_out"): 

Así que creo que tengo que empezar de cero. ¿Cuál es la forma más sencilla de hacer que cualquier ruta de Devise use https, pero el resto de las rutas de mi aplicación usan http? He intentado esto (del SO puesto en la parte superior):

#devise routes 
    scope :protocol => 'https://', :constraints => { :protocol => 'https://' } do 
    devise_for :users, :controllers => { :registrations => :registrations } 
    devise_for :admins 
    end 

Pero no ir. Necesito una mejor sugerencia.

Respuesta

10

No hay respuestas aún, así que esto es lo que llegué a la conclusión:

  1. Una vez que acceda a un sitio a través de https, no acceder a ella a través de http hasta que cierra la sesión (ataque Firesheep). Hay muchas cosas en Devise en el artículo vinculado anteriormente que discute solo tener https en la página de inicio/finalización de sesión. Mala idea.

  2. Todo lo que realmente necesita es la siguiente:

    #in config/environments/production.rb 
    config.to_prepare { Devise::SessionsController.force_ssl } 
    config.to_prepare { Devise::RegistrationsController.force_ssl } 
    
  3. Yo tenía un montón de problemas que rodean 'after_sign_in_path' de inventar. Resulta que after_sign_out_path_for espera que se devuelva una ruta; no se trata de un evento, sino de dónde debe dirigirse el usuario. Así que volví root_path :protocol => 'http://' y eso me ocupó.

2

Trate de hacer todo el uso de aplicaciones HTTPS añadiendo:

#in config/environments/production.rb 
config.force_ssl = true 

Yo tenía el mismo problema. A veces salgo bien, a veces obtengo el 301 de la acción DELETE y lo redirijo a GET. Para mí este fue el problema.

3

Asegúrate de utilizar https en todos tus enlaces de Devise (esto evita el redireccionamiento de force_ssl).

En su routes.rb (sólo se aplica en el entorno de producción):

scope defaults: (Rails.env.production? ? { protocol: 'https' } : {}) do 
    devise_for :users 
end 

En su uso de la aplicación:

destroy_user_session_url # use _url instead of _path so the protocol is added! 

Ahora su cierre de sesión/cerrar sesión enlace (y otros enlaces Idear) apuntará directamente a https. Se evita la reescritura force_ssl de HTTP DELETE a HTTPS GET.Todo funciona :)

Cuestiones relacionadas