{"id":296,"date":"2011-11-28T18:10:35","date_gmt":"2011-11-28T17:10:35","guid":{"rendered":"http:\/\/capri.dev\/blog\/?p=296"},"modified":"2012-01-26T20:44:35","modified_gmt":"2012-01-26T19:44:35","slug":"rails-3-0-http-y-https-conviviendo-en-armonia","status":"publish","type":"post","link":"https:\/\/capri.dev\/blog\/rails-3-0-http-y-https-conviviendo-en-armonia\/","title":{"rendered":"Rails 3.0, HTTP y HTTPS conviviendo en armon\u00eda"},"content":{"rendered":"<p>Uno de los \u00faltimos problemas con los que me he tenido que enfrentar ha sido la labor de conseguir que convivan rutas HTTP y HTTPS en una aplicaci\u00f3n Rails 3.0 de forma que s\u00f3lo se utilice HTTPS para unas pocas acciones determinadas y el resto de la aplicaci\u00f3n se pueda navegar sin encriptar.<\/p>\n<p>Hay muchos art\u00edculos en la red explicando c\u00f3mo conseguir parte de la tarea, pero en todos los casos la informaci\u00f3n me resultaba incompleta porque:<\/p>\n<ul>\n<li>En muchos de los ejemplos encontrados hab\u00eda que convertir la aplicaci\u00f3n completa a HTTPS (yo s\u00f3lo quer\u00eda aplicar la encriptaci\u00f3n a unas pocas acciones)<\/li>\n<li>En la mayor\u00eda de casos hab\u00eda que instalar un certificado para trabajar en local (yo en local quer\u00eda seguir trabajando sin SSL, utiliz\u00e1ndolo s\u00f3lo en producci\u00f3n)<\/li>\n<li>\u00a1Algunas soluciones incluso pasaban por la modificaci\u00f3n de Webrick para poder trabajar en la m\u00e1quina de desarrollo con los 2 protocolos a la vez!<\/li>\n<li>En la mayor\u00eda de soluciones, una vez que se forzaba el uso de SSL para una ruta, el resto de rutas no volv\u00edan a ser HTTP.<\/li>\n<li>La soluci\u00f3n utilizando before_filters en todos los controladores para desactivar HTTPS me resultaba muy engorrosa debido a que la aplicaci\u00f3n en la que trabajo tiene muchos controladores, adem\u00e1s de no ce\u00f1irse nada a los principios DRY que siempre procuro tener presentes.<\/li>\n<\/ul>\n<p>Despu\u00e9s de 2 d\u00edas de investigaci\u00f3n la soluci\u00f3n que fabriqu\u00e9 fue:<br \/>\n<!--more--><br \/>\n1. Activar la posibilidad de trabajar con los protocolos HTTP y HTTPS en paralelo a trav\u00e9s de la gema \u00abRack::SSL\u00bb, a\u00f1adiendo en config\/environments\/production.rb:<\/p>\n<pre class=\"prettyprint\">\r\nconfig.middleware.insert_before ActionDispatch::Static, Rack::SSL, :exclude => proc { |env| env['HTTPS'] != 'on' }\r\n<\/pre>\n<p>seg\u00fan la documentaci\u00f3n encontrada <a href=\"http:\/\/www.simonecarletti.com\/blog\/2011\/05\/configuring-rails-3-https-ssl\/\" target=\"_blank\">aqu\u00ed<\/a><br \/>\nPor supuesto para que esto funcione, debemos incluir Rack::SSL en nuestro Gemfile:<\/p>\n<pre class=\"prettyprint\">\r\ngem 'rack-ssl', :require => 'rack\/ssl'\r\n<\/pre>\n<p>y actualizar nuestro paquete usando el bundler:<br \/>\nbundle install<\/p>\n<p>2. A\u00f1adir un filtro previo a la ejecuci\u00f3n de cualquier m\u00e9todo de cualquier controlador que distinga si la acci\u00f3n llamada es una acci\u00f3n segura o no. Es decir, a\u00f1adir en mi application_controller.rb:<\/p>\n<pre class=\"prettyprint\">\r\nbefore_filter :decidir_protocolo\r\n<\/pre>\n<p>y la definici\u00f3n de este m\u00e9todo:<\/p>\n<pre class=\"prettyprint\">\r\nprivate\r\n\r\ndef decidir_protocolo\r\n  acciones_seguras = {\r\n    :controlador1 => [\"accion1\", \"accion2\"],\r\n    :controlador2 => [\"accion3\"],\r\n    :controlador3 => [\"accion4\",\"accion5\",\"accion6\"]\r\n  }\r\n  #s\u00f3lo se aplica el filtro si estamos en producci\u00f3n\r\n  if Rails.env.production?\r\n    #si se trata de una acci\u00f3n de las que he definido como seguras\r\n    if accion = acciones_seguras[params[:controller].to_sym] and accion.include? params[:action]\r\n      #y si el protocolo de llamada no es ssl\r\n      if !request.ssl?\r\n        #fuerzo el protocolo https\r\n        redirect_to :protocol => 'https'\r\n      end\r\n    #en caso de no tratarse de una acci\u00f3n segura\r\n    else\r\n      #y de venir de una acci\u00f3n que s\u00ed lo era\r\n      if request.ssl?\r\n        #fuerzo el protocolo http\r\n        redirect_to :protocol => 'http'\r\n      end\r\n    end\r\n  end\r\nend\r\n<\/pre>\n<p>Me parece una soluci\u00f3n muy buena que no tiene ninguno de los inconvenientes de las soluciones encontradas, que me echaban para atr\u00e1s.<\/p>\n<p>\u00a1Espero que te ayude!, aunque Rails 3.1 ya viene con la capacidad de gestionar SSL de serie&#8230; pero no s\u00e9 si lo har\u00e1 tan bien \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uno de los \u00faltimos problemas con los que me he tenido que enfrentar ha sido la labor de conseguir que convivan rutas HTTP y HTTPS en una aplicaci\u00f3n Rails 3.0 de forma que s\u00f3lo se utilice HTTPS para unas pocas acciones determinadas y el resto de la aplicaci\u00f3n se pueda navegar sin encriptar. Hay muchos art\u00edculos en la red explicando c\u00f3mo conseguir parte de la tarea, pero en todos los casos la informaci\u00f3n me resultaba incompleta porque: En muchos de los ejemplos encontrados hab\u00eda que convertir la aplicaci\u00f3n completa a HTTPS (yo s\u00f3lo quer\u00eda aplicar la encriptaci\u00f3n a unas pocas acciones) En la mayor\u00eda de casos hab\u00eda que instalar un certificado para trabajar en local (yo en local quer\u00eda seguir trabajando sin SSL, utiliz\u00e1ndolo s\u00f3lo en producci\u00f3n) \u00a1Algunas soluciones incluso pasaban por la modificaci\u00f3n de Webrick para poder trabajar en la m\u00e1quina de desarrollo con los 2 protocolos a la [&hellip;]<\/p>\n<p><a class=\"more-link\" href=\"https:\/\/capri.dev\/blog\/rails-3-0-http-y-https-conviviendo-en-armonia\/\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-296","post","type-post","status-publish","format-standard","hentry","category-tecnico"],"_links":{"self":[{"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/posts\/296","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/comments?post=296"}],"version-history":[{"count":0,"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/posts\/296\/revisions"}],"wp:attachment":[{"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/media?parent=296"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/categories?post=296"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/tags?post=296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}