ruby-on-rails session cookies subdomain

ruby on rails - ¿Qué hace Rails 3 session_store domain: todo realmente?



ruby-on-rails cookies (5)

Pregunta actualizada para que quede más claro

Entiendo que puede configurar el dominio de su session_store para compartir sesiones entre subdominios como este: Rails.application.config.session_store :cookie_store, :key => ''_my_key'', :domain => "mydomain.com"

en Rails 3, ¿qué hace la configuración :domain => :all do? No puede permitirle compartir sesiones en dominios de nivel superior, las cookies no pueden hacerlo. La documentación dice que asume un dominio de nivel superior. Entonces, ¿qué sucede si múltiples dominios acceden a su aplicación?

En mi aplicación, mis usuarios pueden crear subdominios personales de un dominio principal, pero luego también pueden acceder a ese subdominio a través de su propio dominio personalizado.

¿Cuál es la configuración de dominio session_store correcta para poder: a) compartir sesiones en todos los dominios de mi dominio principal, por ejemplo, "mydomain.com" b) usuarios que acceden a su subdominio personal, por ejemplo, "usuario1.midominio.com" a través de un CNAME personalizado url como "some.otherdomain.com" aún puede crear sesiones separadas.

Gracias


Esta opción se usa para garantizar que la aplicación pueda compartir sesiones entre subdominios. La opción: all asume que nuestra aplicación tiene un tamaño de dominio de primer nivel de 1. De lo contrario, podemos especificar un nombre de dominio y se usará como dominio base para la sesión.


Hmmm,

Implemento una aplicación alojada en www.xyz.com y en xyz.com.

Para mí,: domain =>: all establece el dominio de la cookie de sesión en xyz.com. Entonces no para un dominio de nivel superior, sino para 1 nivel por encima del tld.

Jan Willem


No creía que ninguna de las respuestas existentes respondiera directamente a la pregunta en el título, así que quería participar.

Cuando el cliente (navegador) va a un sitio web, el sitio web le dice al cliente que establezca una cookie. Cuando lo hace, especifica el nombre, el valor, el dominio y la ruta de la cookie.

:domain => :all le dice a Rails que ponga un punto delante del dominio de la cookie (que es el servidor al que ha navegado su navegador), de forma que la cookie se aplica a todos los subdominios.

Aquí está el código relevante de Rails 4.1 ( actionpack/lib/action_dispatch/middleware/cookies.rb ):

def handle_options(options) #:nodoc: options[:path] ||= "/" if options[:domain] == :all # if there is a provided tld length then we use it otherwise default domain regexp domain_regexp = options[:tld_length] ? /([^.]+/.?){#{options[:tld_length]}}$/ : DOMAIN_REGEXP # if host is not ip and matches domain regexp # (ip confirms to domain regexp so we explicitly check for ip) options[:domain] = if (@host !~ /^[/d.]+$/) && (@host =~ domain_regexp) ".#{$&}" end elsif options[:domain].is_a? Array # if host matches one of the supplied domains without a dot in front of it options[:domain] = options[:domain].find {|domain| @host.include? domain.sub(/^/./, '''') } end end

Veo que ya respondió la segunda parte de su pregunta sobre permitir que los subdominios tengan sesiones separadas.


OK, la forma de lograr esto es establecer dinámicamente el dominio en la cookie de sesión. Para hacer esto lo suficientemente temprano, debe hacerse como middleware de rack:

# Custom Domain Cookie # # Set the cookie domain to the custom domain if it''s present class CustomDomainCookie def initialize(app, default_domain) @app = app @default_domain = default_domain end def call(env) host = env["HTTP_HOST"].split('':'').first env["rack.session.options"][:domain] = custom_domain?(host) ? ".#{host}" : "#{@default_domain}" @app.call(env) end def custom_domain?(host) host !~ /#{@default_domain.sub(/^/./, '''')}/i end end


tl; dr: Usa el código de . PERO encontré que necesitaba agregarlo a mi conifg/environments/[production|development].rb y pasar mi dominio con prefijo de punto como argumento. Esto está en Rails 3.2.11

Las sesiones de cookies generalmente se almacenan solo para su dominio de nivel superior.

Si miras en Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com} Puedes ver que habrá entradas separadas para sub1.yourdomain.com y othersub.yourdomain.com y othersub.yourdomain.com

El desafío es usar el mismo archivo de tienda de sesión en todos los subdominios.

Paso 1: use el código CustomDomainCookie

Aquí es donde entra en juego el Rack Middleware . Algunos recursos más relevantes sobre racks y rieles:

Básicamente, lo que hace es mapear todos los datos de la sesión de cookies en el mismo archivo de cookies que es igual a su dominio raíz.

Paso 2: Agregar a Rails Config

Ahora que tienes una clase personalizada en lib, asegúrate de que esté autocargada. Si eso no significaba nada para ti, mira aquí: Rails 3 autoload

Lo primero es asegurarse de estar en todo el sistema utilizando una tienda de cookies. En config/application.rb le decimos a Rails que use una tienda de cookies.

# We use a cookie_store for session data config.session_store :cookie_store, :key => ''_yourappsession'', :domain => :all

La razón por la que esto se menciona aquí se debe a :domain => :all line. Hay otras personas que han sugerido especificar :domain => ".yourdomain.com" lugar de :domain => :all . Por alguna razón, esto no funcionó para mí y necesitaba la clase de Middleware personalizada como se describe arriba.

Luego, en su config/environments/production.rb agregue:

config.middleware.use "CustomDomainCookie", ".yourdomain.com"

Tenga en cuenta que el punto anterior es necesario. Consulte " cookies del subdominio, enviadas en una solicitud de dominio principal " por qué.

Luego, en su config/environments/development.rb agregue:

config.middleware.use "CustomDomainCookie", ".lvh.me"

El truco lvh.me se asigna a localhost. Es impresionante. Vea este Railscast sobre los subdominios y esta nota para más información.

Con suerte eso debería hacerlo. Honestamente, no estoy del todo seguro de por qué el proceso es así de intrincado, ya que creo que los sitios de subdominios cruzados son comunes. Si alguien tiene más información sobre las razones detrás de cada uno de estos pasos, por favor, infórmenos en los comentarios.