¿Es posible tener 2 sesiones activas diferentes al compartir cookies de sesión entre diferentes subdominios?
En nuestra aplicación, una Cuenta
tiene varios Usuarios
y cada cuenta diferente tiene un subdominio (por ejemplo: cuenta.nuestraapp.com
).
También reservamos el subdominio app
para nosotros como app.nuestraapp.com
, que actúa como un inicio de sesión genérico desde donde un Usuario
puede iniciar sesión en cualquier cuenta si se proporcionan las combinaciones correctas de subdominio
, email
y password
.
controlador de inicio de sesión genérico:
class App::SessionsController < AppController
def new
@session_form = SessionForm.new
end
def create
@session_form = SessionForm.new(params: session_params)
if @session_form.save
account = @session_form.account
user = @session_form.user
log_in user
redirect_to admin_users_url(subdomain: account.subdomain)
else
render :new
end
end
private
def session_params
params.require(:session_form).permit(:account_subdomain, :email, :password)
end
end
Debido a que la sesión del Usuario se crea en app.nuestraapp.com
pero el Usuario es redirigido a cuenta.nuestraapp.com
después de la autenticación, nuestro archivo session_store
se ve así:
Rails.application.config.session_store :cookie_store, key: '_ourapp_session',
domain: :all,
tld_length: 2
Con la configuración anterior, la sesión creada en el subdominio app
sigue siendo válida para el subdominio cuenta
.
El problema al que nos enfrentamos es que algunas personas que usan nuestra aplicación administran más de una cuenta, y si Bob inicia sesión en primercuenta.nuestraapp.com
con el Usuario id 1
y luego en segundacuenta.nuestraapp.com
con el Usuario id 5
en la misma computadora, la primera sesión se elimina y el Usuario se desconecta.
¿Por qué se elimina la primera sesión si los subdominios de la cuenta y las identificaciones de los usuarios son diferentes?
¿Es posible compartir sesiones entre subdominios (para que la sesión creada en app.nuestraapp.com
funcione para cuenta.nuestraapp.com
), pero también tener múltiples sesiones con diferentes Usuarios abiertas al mismo tiempo?
davy.ai
La razón por la que se elimina la primera sesión es porque el dominio de la cookie de sesión se establece en
:all
, lo que significa que es válido para todos los subdominios deourapp.com
. Entonces, cuando Bob inicia sesión ensecondaccount.ourapp.com
, el dominio de la cookie de sesión se sobrescribe consecondaccount.ourapp.com
y la cookie de sesión anterior parafirstaccount.ourapp.com
ya no es válida. Por lo tanto, se elimina la primera sesión y el usuario cierra sesión.Para compartir sesiones en varios subdominios pero también tener varias sesiones abiertas al mismo tiempo con diferentes usuarios, podemos establecer el dominio de la cookie de sesión en
.ourapp.com
, con un punto inicial. Esto hará que la cookie de sesión sea válida para todos los subdominios deourapp.com
, incluyendoapp.ourapp.com
yaccount.ourapp.com
. Sin embargo, cada sesión de usuario debe tener un ID de sesión único para diferenciarlas entre sí. Esto se puede lograr estableciendo la clave de sesión en'_ourapp_session_' + user.id.to_s
, en lugar de solo'_ourapp_session'
. Con esta configuración, se pueden abrir múltiples sesiones con diferentes usuarios al mismo tiempo, en diferentes subdominios, a la vez que se comparte la misma cookie de sesión.