Por algum motivo, a substituição :all
com o domínio não funcionou (rails 3.2.11) para mim. Foi preciso um middleware personalizado para consertar. Um resumo dessa solução está abaixo.
tl; dr: Você precisa escrever um Middleware de Rack personalizado. Você precisa adicioná-lo ao seu conifg/environments/[production|development].rb
. Isso está no Rails 3.2.11
As sessões de cookies geralmente são armazenadas apenas para o seu domínio de nível superior.
Se você olhar em Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}
você pode ver que haverá entradas separadas para sub1.yourdomain.com
e othersub.yourdomain.com
eyourdomain.com
O desafio é usar o mesmo arquivo de armazenamento de sessão em todos os subdomínios.
Etapa 1: adicionar classe de middleware personalizada
É aqui que entra o Rack Middleware . Alguns recursos de rack e trilhos relevantes:
Aqui está uma classe personalizada que você deve adicionar no lib
This foi escrito por @Nader e todos vocês devem agradecê-lo
# 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
Basicamente, o que isso faz é mapear todos os dados da sua sessão de cookie de volta para o mesmo arquivo de cookie que é igual ao seu domínio raiz.
Etapa 2: Adicionar à configuração do Rails
Agora que você tem uma classe personalizada em lib, certifique-se de carregá-la automaticamente. Se isso não significava nada para você, veja aqui: autoload do Rails 3
A primeira coisa é certificar-se de que você está usando um armazenamento de cookies em todo o sistema. Em config/application.rb
nós dizemos ao Rails para usar um armazenamento de cookies.
# We use a cookie_store for session data
config.session_store :cookie_store,
:key => '_yourappsession',
:domain => :all
A razão pela qual isso está aqui é mencionado aqui é por causa da :domain => :all
linha. Outras pessoas sugeriram especificar em :domain => ".yourdomain.com"
vez de:domain => :all
. Por algum motivo, isso não funcionou para mim e eu precisava da classe de Middleware personalizada conforme descrito acima.
Então, em seu config/environments/production.rb
add:
config.middleware.use "CustomDomainCookie", ".yourdomain.com"
Observe que o ponto anterior é necessário. Consulte " cookies de subdomínio, enviados em uma solicitação de domínio pai? " Para saber por quê.
Então, em seu config/environments/development.rb
add:
config.middleware.use "CustomDomainCookie", ".lvh.me"
O truque do lvh.me mapeia para localhost. É incrivel. Veja este Railscast sobre subdomínios e esta nota para mais informações.
Esperançosamente isso deve bastar. Sinceramente, não tenho certeza de por que o processo é tão complicado, pois acho que sites de subdomínios cruzados são comuns. Se alguém tiver mais informações sobre as razões por trás de cada uma dessas etapas, esclareça-nos nos comentários.