Como utilizar SSL en Ruby on Rails

Ene 10 2010

Hace poco tuve que implementar SSL en una tienda de un proyecto hecho en Rails, por lo que parte de la web debía funcionar con un certificado SSL mientras que parte debía funcionar sin problemas sin dicho certificado. Me sorprendió la poca información que se puede encontrar al respecto, cuando debe de tratarse de algo bastante común.
Pese a lo que pueda parecer tras una primera búsqueda de información, no es necesario ningún plugin; tan sólo seguir los siguienes pasos:

1- Puesto que utilizar un certificado de seguridad en development puede darnos algunos problemas, lo primero es diferenciar de una manera eficaz los entornos que van a usar SSL. Así pues, en environment.rb definimos una constante:

SSL_ENVIRONMENTS = ['preproduction', 'production']

2- A continuación definimos las rutas que deben usar https en vez de http, siempre y cuando estemos trabajando en el entorno correspondiente. De este modo, al principio de routes.rb ponemos:

ROUTES_PROTOCOL = SSL_ENVIRONMENTS.include?(RAILS_ENV) ? https : http\r

Para luego definir las rutas en cuestión del siguiente modo:

#Rutas que utilizan http
 map.with_options :protocol => 'http' do |http|
   http.root :controller => pages,  :action => show\r
 end

#Rutas que utilizan https (en función del entorno de trabajo)
map.with_options :protocol => ROUTES_PROTOCOL do |https|
   https.prepare_payment '/compra/paso_1',
     :controller => 'payment_attempts', :action => 'prepare'
   https.check_payment '/compra/paso_2',
     :controller => 'payment_attempts', :action => 'show'
end

3- En vez de usar route_name_path hay que usar route_name_url. Esto es así debido a que con ‘_path’ siempre usamos rutas relativas (del tipo ‘/compra’, por ejemplo), lo cual no interesa, puesto que estaríamos manteniendo siempre el protocolo actual, ya sea http o https. Por ello debemos usar ‘_url’, que utilizará siempre el protocolo adecuado para cada ruta, según hemos indicado en el fichero de rutas.

Tags: Rails, SSL

Comentarios

No hay comentarios todavía para este post

Nuevo comentario